如何使用 JPA 1.0 构建一个 JPQL 查询,从多个表中获取数据以克服延迟初始化?

Posted

技术标签:

【中文标题】如何使用 JPA 1.0 构建一个 JPQL 查询,从多个表中获取数据以克服延迟初始化?【英文标题】:How to construct a JPQL query getting data from several tables overcoming lazy initialization using JPA 1.0? 【发布时间】:2015-02-11 17:38:55 【问题描述】:

我需要使用基于 OpenJPA JPA 1.0 的 JPQL 查询从多个表中获取数据。 使用自然连接构造和执行查询是有效的,但由于延迟初始化,我没有在结果中得到相关对象。

query=" SELECT ledger from SdiOrderSkuLedger ledger, SdiOrderSku sOrderSku, 
OrderSkuImpl orderSku, ProductSkuImpl productSku 
WHERE ledger.sdiOrderSku.uidPk=sOrderSku.uidPk 
AND sOrderSku.orderSku.uidPk=orderSku.uidPk 
AND orderSku.productSkuInternal.uidPk=productSku.uidPk
AND ledger.createdDate between :startDate AND :endDate
AND productSku.uidPk IN (:ids)

我可以使用 join fetch 构造查询(在这个项目的其他情况下,join fetch 对我有用):

query=" SELECT ledger from SdiOrderSkuLedger ledger
join fetch ledger.sdiOrderSku sOrderSku
join fetch sOrderSku.orderSku orderSku join fetch orderSku.productSkuInternal productSku 
WHERE ledger.sdiOrderSku.uidPk=sOrderSku.uidPk 
AND sOrderSku.orderSku.uidPk=orderSku.uidPk 
AND orderSku.productSkuInternal.uidPk=productSku.uidPk
AND ledger.createdDate between :startDate AND :endDate
AND productSku.uidPk IN (:ids)

然后我得到错误:

org.apache.renamed.openjpa.persistence.ArgumentException:在字符 76 处遇到“sOrderSku”,但预期为:[“”、“.”、“GROUP”、“HAVING”、“INNER”、“JOIN” 、“左”、“顺序”、“在哪里”、]。 在 org.apache.renamed.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:9501)

【问题讨论】:

【参考方案1】:

错误在字符 52 处遇到“fetch”,但应为:[",", ".", "AS", "GROUP", "HAVING", "INNER", "JOIN", "LEFT ", "订单", "哪里", , ]。 at 是因为您的 JPQL 中有一个“,”。

从 SdiOrderSkuLedger 的 SELECT 分类帐中删除“,”分类帐,

【讨论】:

谢谢,我更正了“,”,但还是有进一步的错误,请看更正后的文字【参考方案2】:

似乎一旦我添加了“JOIN FETCH”,我就不再需要 INNER JOIN 条件了。因此,得到的工作 JPQL 查询如下:

query=" SELECT ledger from SdiOrderSkuLedger ledger
                        join fetch ledger.sdiOrderSku
                        join fetch ledger.sdiOrderSku.orderSku
                        join fetch ledger.sdiOrderSku.orderSku.productSkuInternal
                        join fetch ledger.sdiPriceListAssignment
        WHERE ledger.createdDate between :startDate AND :endDate
        AND ledger.sdiOrderSku.orderSku.productSkuInternal.uidPk IN (:ids) "

【讨论】:

以上是关于如何使用 JPA 1.0 构建一个 JPQL 查询,从多个表中获取数据以克服延迟初始化?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPQL(Spring JPA 查询)中使用 JOIN 执行 UPDATE 语句?

如何在 JPA JPQL 查询中加入两个实体集合?

JPA JPQL简介

使用 JPQL 加入标准

Spring jpa jpql查询

JPA JPQL - 如果不使用子对象(没有主键/外键关系)并且可以删除,则返回的查询