如何透過建構函式和JPQL生成DTO?

banq發表於2019-02-13

獲取超出需要的資料更容易導致效能損失。使用DTO可以讓我們只提取所需的資料。在這個應用程式中,我們依賴於Constructor Expression和JPQLL生成DTO。點選DTO標籤可獲得更多生成DTO的方式
同樣,在DDD程式設計中,從DDD聚合中獲取DDD值物件有多種方式,如果我們不使用DTO方式,直接返回完整實體聚合,容易導致效能損失,使用DTO可以讓我們只提取所需的資料。

1. 編寫一個帶有構造引數的DTO,其實這是一個DDD值物件:


public class CarDto implements Serializable {

    private static final long serialVersionUID = 1L;

    private final String name;
    private final String color;

    public CarDto(String name, String color) {
        this.name = name;
        this.color = color;
    }


2. 編寫自己的DAO,使用JPQL“select new com.jpa.CarDto(c.name, c.color) from Car c”建立帶引數的DTO。


@Repository
@Transactional
public class Dao<T, ID extends Serializable> implements GenericDao<T, ID> {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public <S extends T> S persist(S entity) {
        
        Objects.requireNonNull(entity, "Cannot persist a null entity");
        
        entityManager.persist(entity);

        return entity;
    }

    @Transactional(readOnly=true)
    public List<CarDto> fetchCars() {
        Query query = entityManager
                .createQuery("select new com.jpa.CarDto(c.name, c.color) from Car c",
                        CarDto.class);                
        List<CarDto> result = query.getResultList();

        return result;
    }


Service呼叫:


@Service
public class CarService {

    private final Dao dao;

    public CarService(Dao dao) {
        this.dao = dao;
    }

    public List<CarDto> fetchCars() {
        return dao.fetchCars();
    }
}


原始碼下載

相關文章