当前位置: 首页 > 知识库问答 >
问题:

查询指定了联接提取,但提取的关联的所有者不在选择列表中

梁丘兴腾
2023-03-14

我选择两个id列,但指定错误:

org.hibernate.QueryException: **query specified join fetching, but the owner of the fetched association was not present in the select list** 

[FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=r,role=null,tableName=REVISIONS,tableAlias=revision1_,origin=ENTITY_CHANGED_IN_REVISION entitychan0_,columns={entitychan0_.REV_ID ,className=ru.csbi.registry.domain.envers.Revision}}] [ select ec.id as entityChangeId, r.id as revisionId from ru.csbi.registry.domain.envers.EntityChange as ec  inner join fetch ec.revision as r  where ec.groupEntityId = :groupEntityId and ec.groupName = :groupName  and r.timestamp < :entityDateFrom  and r.timestamp > :entityDateTo  and (        ec.revisionType in (0, 5, 1, 4, 2 )       and not ( ec.otherGroupEntityModified = false and ec.thisGroupEntityModified = true and ec.rowDataModified = false and ec.collectionOfNotGroupEntityModified = false   )      )  group by ec.id, r.id  having count(*) > :start order by r.id desc]

一些代码:

String hql = " select ec.id as entityChangeId, r.id as revisionId from EntityChange as ec " +
            " inner join fetch ec.revision as r " +
            " where ec.groupEntityId = :groupEntityId" +
            " and ec.groupName = :groupName " +
            " and r.timestamp < :entityDateFrom " +
            " and r.timestamp > :entityDateTo " +
            " and ( " +
            "       ec.revisionType in (" + 
                        RevisionType.ADD.getRepresentation() + ", " + 
                        RevisionType.ONLY_DATA_PROPERTY_MOD.getRepresentation() + ", " +
                        RevisionType.BOTH_COLLECTION_AND_PROPERTY_MOD.getRepresentation() + ", " +
                        RevisionType.ONLY_COLLECTION_PROPERTY_MOD.getRepresentation() + ", " +
                        RevisionType.DEL.getRepresentation() +
                    " ) " +
            "     and not ( "+
                    "ec.otherGroupEntityModified = false and " +
                    "ec.thisGroupEntityModified = true and " +
                    "ec.rowDataModified = false and " +
                    "ec.collectionOfNotGroupEntityModified = false " +
                "  ) " +
            "     ) " +
            " group by ec.id, r.id " +
            " having count(*) > :start" +
            " order by r.id desc";

如何修复错误,我做错了什么?

共有3个答案

吴安和
2023-03-14

您必须将相关项目列放入selection子句中

select ec.id as entityChangeId, r.id as revisionId, **r.revision** 
from EntityChange as ec " +
        " inner join fetch ec.revision as r " +
令狐宏伟
2023-03-14

由于您需要加入提取,删除提取将无法满足您的需要。

您应该做的是将count查询与之一起指定。

假设您正在分页结果,下面是一个JPA查询,它将id作为参数,并会导致您指定的问题,第二个查询通过向其添加count查询来解决这个问题。

注意:fk\u字段是表A中具有一对多rln的属性。count查询不使用join fetch。

@Query(value = "from TableA a LEFT JOIN FETCH a.fk_field where a.id = :id") 

@Query(value = "from TableA a LEFT JOIN FETCH a.fk_field where a.id = :id", 
  countQuery = " select  count(a) from TableA a left join a.fk_field where a.id = :id")
       

拓拔富
2023-03-14

使用常规的连接,而不是连接获取(顺便说一下,默认情况下是内部的):

String hql = " select ec.id as entityChangeId, r.id as revisionId from EntityChange as ec " + 
        " join ec.revision as r " + ...

正如错误消息告诉您的那样,连接获取在这里没有意义,因为它是强制急切加载集合的性能提示。

 类似资料:
  • 问题内容: 我正在选择两个id列,但指定了错误: 一些代码: 如何解决错误,我在做什么错? 问题答案: 使用常规而不是(顺便说一句,默认情况下): 正如错误消息告诉您的那样,在这里没有意义,因为它是一种性能提示,会迫使人们急切加载收藏。

  • 我有以下代码: 它引发了一个异常: 结果我只想得到代码。

  • 我去研究了关于JPA2.1规范的信息,这就是我发现的: 用于联接的联接条件来自映射的联接列。这意味着JPQL用户通常不必知道每个关系是如何连接的。在某些情况下,需要在连接条件中附加附加条件,通常是在外部连接的情况下。这可以通过ON子句来实现。ON子句在JPA2.1规范中定义,某些JPA提供程序可能支持ON子句。EclipseLink:Hibernate:TopLink-支持ON子句。 需要注意的是

  • 我正在尝试使用JPA查询使用以下查询从DB中获取数据: 其中,id=candidate_id(主表的主键)。 该查询也从其所有关联表中获取数据,而我的要求是仅从其2个关联表中获取数据。因为第三个表包含大量JSON数据,这会降低上述查询的响应时间。 我尝试使用JOIN,获取父级的JOIN及其2个关联表,但它不起作用。我还在研究如何在获取候选数据时只跳过一列数据(带有大量JSON的第3个表的列),但运

  • TL;DR:如何使用Spring Data JPA中的规范复制JPQL Join-Fetch操作? 在本例中,每次我要检索记录时,我还想要它关联的和记录。这一切都按预期工作,对单个的请求将引发3个查询:、和表各一个查询。 问题是,没有理由需要运行3个查询来获得具有嵌入属性和别名的单个实体。这可以在普通SQL中完成,也可以在我的Spring Data JPA存储库中使用JPQL查询完成: 如何使用规