获取超出需要的数据更容易导致性能损失。使用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(); } }
|
源码下载