猿问

如何在 Criteria API / JPQL 中使用具有一对多属性的 JPA 投影

我在使用 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();

}


慕码人8056858
浏览 84回答 1
1回答

动漫人物

连接为您提供 sql 中的行结果集合:Parent&nbsp; &nbsp; Childp1&nbsp; &nbsp; &nbsp; &nbsp; c1p1&nbsp; &nbsp; &nbsp; &nbsp; c2p1&nbsp; &nbsp; &nbsp; &nbsp; c3等等。没有将生成的集合传递给构造函数的机制。JPA 规范 4.14constructor_expression ::=NEW constructor_name ( constructor_item {, constructor_item}* )constructor_item ::=single_valued_path_expression |scalar_expression |aggregate_expression |identification_variable此外,另一个问题是您的查询可能会返回多个父项或子项。Parent&nbsp; &nbsp; Child&nbsp; &nbsp; Child2p1&nbsp; &nbsp; &nbsp; &nbsp; c111&nbsp; &nbsp; &nbsp;c121p1&nbsp; &nbsp; &nbsp; &nbsp; c121&nbsp; &nbsp; &nbsp;p1&nbsp; &nbsp; &nbsp; &nbsp; c131&nbsp; &nbsp; &nbsp;c122p2&nbsp; &nbsp; &nbsp; &nbsp; c211&nbsp; &nbsp; &nbsp;c211p2&nbsp; &nbsp; &nbsp; &nbsp; c221&nbsp; &nbsp; &nbsp;c212p2&nbsp; &nbsp; &nbsp; &nbsp; c231&nbsp; &nbsp; &nbsp;我猜这是因为对于底层 JPA 提供者来说,它变得太复杂了,以至于不知道在哪里拆分它,或者使用哪些值来传递给子构造函数,或者可能是我不熟悉的更微妙的原因。最重要的是,它要求您提供用于解析此矩阵的代码,如果您打算这样做,您也可以在没有 JPA 的情况下解析结果。
随时随地看视频慕课网APP

相关分类

Java
我要回答