获取超出需要的数据更容易导致性能损失。使用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 implements GenericDao {
@PersistenceContext
private EntityManager entityManager;
@Override
public S persist(S entity) {
Objects.requireNonNull(entity, "Cannot persist a null entity");
entityManager.persist(entity);
return entity;
}
@Transactional(readOnly=true)
public List fetchCars() {
Query query = entityManager
.createQuery("select new com.jpa.CarDto(c.name, c.color) from Car c",
CarDto.class);
List result = query.getResultList();
return result;
}
Service调用:
@Service
public class CarService {
private final Dao dao;
public CarService(Dao dao) {
this.dao = dao;
}
public List fetchCars() {
return dao.fetchCars();
}
}