如何通過建構函式和JPQL生成DTO?
獲取超出需要的資料更容易導致效能損失。使用DTO可以讓我們只提取所需的資料。在這個應用程式中,我們依賴於Constructor Expression和JPQLL生成DTO。點選#DTO標籤可獲得更多生成DTO的方式。
同樣,在DDD程式設計中,從DDD聚合中獲取DDD值物件有多種方式,如果我們不使用DTO方式,直接返回完整實體聚合,容易導致效能損失,使用DTO可以讓我們只提取所需的資料。
1. 編寫一個帶有構造引數的DTO,其實這是一個DDD值物件:
<b>public</b> <b>class</b> CarDto implements Serializable { <b>private</b> <b>static</b> <b>final</b> <b>long</b> serialVersionUID = 1L; <b>private</b> <b>final</b> String name; <b>private</b> <b>final</b> String color; <b>public</b> CarDto(String name, String color) { <b>this</b>.name = name; <b>this</b>.color = color; }
2. 編寫自己的DAO,使用JPQL“select new com.jpa.CarDto(c.name, c.color) from Car c”建立帶引數的DTO。
@Repository @Transactional <b>public</b> <b>class</b> Dao<T, ID <b>extends</b> Serializable> implements GenericDao<T, ID> { @PersistenceContext <b>private</b> EntityManager entityManager; @Override <b>public</b> <S <b>extends</b> T> S persist(S entity) { Objects.requireNonNull(entity, <font>"Cannot persist a null entity"</font><font>); entityManager.persist(entity); <b>return</b> entity; } @Transactional(readOnly=<b>true</b>) <b>public</b> List<CarDto> fetchCars() { Query query = entityManager .createQuery(</font><font>"select new com.jpa.CarDto(c.name, c.color) from Car c"</font><font>, CarDto.<b>class</b>); List<CarDto> result = query.getResultList(); <b>return</b> result; } </font>
Service呼叫:
@Service <b>public</b> <b>class</b> CarService { <b>private</b> <b>final</b> Dao dao; <b>public</b> CarService(Dao dao) { <b>this</b>.dao = dao; } <b>public</b> List<CarDto> fetchCars() { <b>return</b> dao.fetchCars(); } }