运行 使用 DTO 进行 jpa 查询并加入提取时出现异常
exception when running jpa query with DTO and join fetch
我正在尝试 运行 一个带有连接提取的查询,但我也在使用 DTO 投影来提高性能,但我得到以下异常:
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=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 中的产品项。正常的连接就足够了,那样的话,你也不会看到那个错误。
我无法让 JOIN 处理 @OneToMany 关系,所以我采用了另一种方法,即使用 @ManyToOne 关系。这种方式对我有用。
我正在尝试 运行 一个带有连接提取的查询,但我也在使用 DTO 投影来提高性能,但我得到以下异常:
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=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 中的产品项。正常的连接就足够了,那样的话,你也不会看到那个错误。
我无法让 JOIN 处理 @OneToMany 关系,所以我采用了另一种方法,即使用 @ManyToOne 关系。这种方式对我有用。