【问题标题】:exception when running jpa query with DTO and join fetch使用 DTO 运行 jpa 查询并加入 fetch 时出现异常
【发布时间】:2018-01-02 12:12:15
【问题描述】:

我正在尝试使用 join fetch 运行查询,但我也在使用 DTO 投影来提高性能,但出现以下异常:

org.hibernate.QueryException: 查询指定连接获取,但是 选择列表中不存在获取的关联的所有者 [FromElement{explicit,not a collection join,fetch join,fetch non-lazy 属性,classAlias=pi,role=returnitRest.Ereturn.productItems,tableName=product_item,tableAlias=productite1_,origin=ereturn ereturn0_,columns={ereturn0_.id ,className=returnitRest.ProductItem}}] [SELECT DISTINCT new returnitRest.Ereturn(e.rma, e.shipper, e.carrier, e.returnAction) FROM returnitRest.Ereturn e JOIN FETCH e.productItems pi WHERE e.status = 'RECEIVED' AND e.shipper.email = :shipper AND e.carrier.email = :carrier AND pi.returnAction = :returnAction ]

这是查询:

    em.createQuery("SELECT DISTINCT new returnitRest.Ereturn(e.rma, e.shipper, e.carrier, e.returnAction) FROM ereturn e " +
            "JOIN FETCH e.productItems pi " +
            "WHERE e.status = 'RECEIVED' AND " +
            "e.shipper.email = :shipper AND " +
            "e.carrier.email = :carrier AND " +
            "pi.returnAction = :returnAction ")
            .setParameter("shipper", shipperEmail)
            .setParameter("carrier", issuer)
            .setParameter("returnAction", ReturnAction.valueOf(returnAction))
            .getResultList();

问题:

  • 谁是该协会失踪的所有者?
  • 我可以做些什么来修复这个查询并且仍然使用 DTO 来提高性能和连接提取?

非常感谢

【问题讨论】:

  • 我面临同样的问题。如果您对此有解决方案,请告诉我。
  • 我不确定我是否做对了,可能有更多经验的人可以提供帮助,但如果我没记错的话,DTO 只能访问 ROOT 元素(在我的情况下是 Ereturn)所以 ProductItems 不是无障碍

标签: hibernate jpa projection dto


【解决方案1】:

您不需要在这里进行连接提取,您甚至没有使用 DTO 中的产品项。一个普通的连接就足够了,这样你也不会看到那个错误。

【讨论】:

    【解决方案2】:

    我无法让 JOIN 处理 @OneToMany 关系,因此我采取了相反的方法,即使用 @ManyToOne 关系。这种方式对我有用。

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 1970-01-01
      • 2015-04-05
      • 2019-12-02
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      相关资源
      最近更新 更多