从实体中获取DTO数据,也就是从DDD聚合中获取DDD值对象有多种方式,如果我们不使用DTO方式,直接返回完整实体聚合,容易导致性能损失,使用DTO可以让我们只提取所需的数据。在这个应用程序中,我们展示如何依赖于javax.persistence.Tuple和JPQL生成DTO。点击#DTO标签可获得更多生成DTO的方式。
主要方式:
编制自己的Dao调用EntityManager.createQuery(),返回java.persistence.Tuple类型:
@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<Tuple> fetchCars() {
List<Tuple> result = entityManager
.createQuery(
</font><font>"select c.name as name, c.color as color from Car c"</font><font>, Tuple.<b>class</b>
).getResultList();
<b>return</b> result;
}
<b>protected</b> EntityManager getEntityManager() {
<b>return</b> entityManager;
}
}
</font>
在服务中调用:
@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<Tuple> fetchCars() {
<b>return</b> dao.fetchCars();
}
}
客户端调用:
List<Tuple> cars = carService.fetchCars();
cars.forEach((e) -> logger.info(() -> <font>"Car: "</font><font> + e.get(</font><font>"name"</font><font>) + </font><font>","</font><font> + e.get(</font><font>"color"</font><font>)));
</font>
源码下载