我在使用 Criteria API 创建查询时遇到困难,该查询投射被查询实体的属性并实例化 DTO。其中一个投影属性映射了与另一个实体的一对多关系,因此它是一组依赖实体。我正在使用 fetch join 来检索集合。但我收到以下错误:
org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list
我已经尝试使用常规连接,但在这种情况下,不会填充依赖实体集。完全删除连接和/或提取也无济于事。
我正在使用 JPA 规范 2.0、Hibernate 4.2.21.Final、Spring Data JPA 1.10.11.RELEASE。
有人可以就此给我建议吗?我也会为一个工作的 JPQL 感到高兴。
这是我的查询实现:
@Override
public List<EntityADto> findByPartialKey1OrderByPartialKey2(String partialKey1) {
// Create query
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<EntityADto> criteriaQuery = criteriaBuilder.createQuery(EntityADto.class);
// Define FROM clause
final Root<EntityA> root = criteriaQuery.from(EntityA.class);
root.fetch(EntityA_.oneToManyAttribute);
// Define DTO projection
criteriaQuery
.select(criteriaBuilder.construct(
EntityADto.class,
root.get(EntityA_.id).get(EntityAId_.partialKey1),
root.get(EntityA_.id).get(EntityAId_.partialKey2),
root.get(EntityA_.stringAttribute1),
root.get(EntityA_.stringAttribute2),
root.get(EntityA_.oneToManyAttribute)))
.orderBy(criteriaBuilder.asc(root.get(EntityA_.id).get(EntityAId_.partialKey2)))
.distinct(true);
// Define WHERE clause
final ParameterExpression<String> parameterPartialKey1 = criteriaBuilder.parameter(String.class);
criteriaQuery.where(criteriaBuilder.equal(root.get(EntityA_.id).get(EntityAId_.partialKey1), parameterPartialKey1));
// Execute query
final TypedQuery<EntityADto> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.setParameter(parameterPartialKey1, partialKey1);
return typedQuery.getResultList();
}
动漫人物
相关分类