3

使用 Hibernate,我习惯于执行以下操作:

select n from NetworkElement n join fetch n.site s where s.active is true

但是,EclipseLink 对此有很多抱怨:

Caused by: Exception [EclipseLink-8024] (Eclipse Persistence Services - 2.0.0.v20091127-r5931): org.eclipse.persistence.exceptions.JPQLException Exception Description: Syntax error parsing the query [select n from NetworkElement n join fetch n.site s], line 1, column 49: syntax error at [s].

(栈上的查询和上面的不一样,但是结果是一样的)

我尝试了不同的组合,但都没有奏效:

select n from NetworkElement n join fetch n.site where n.site.active is true
select n from NetworkElement n join fetch n.site as site where site.active is true

我还尝试在我的域模型中切换到不同的实体,怀疑我的映射可能不正确。不过,同样的问题。

难道我只能使用查询提示来实现这一点吗?我不想那样做。

顺便说一句,我使用的是 Netbeans 6.8 和 Glassfish v3 附带的 EcliseLink。

我会很感激任何帮助!

罗德里戈

4

2 回答 2

4

主要问题是 JPQL 语法不允许别名获取连接,这就是 EclipseLink 使用查询提示来实现此功能的原因。有一个增强请求可以直接在 JPQL 中添加别名连接提取,如果您希望看到它完成,请投票。(https://bugs.eclipse.org/bugs/show_bug.cgi?id=293775)。

——戈登·约克

于 2010-02-24T15:10:35.767 回答
0

好吧,实际上似乎不允许在 JPQL 中为 fetch join 设置别名。它与 Hibernate 一起使用,因为它支持通过 HQL 进行别名,并且允许您向 JPA Query 对象发出 HQL。

因此,我别无选择,只能切换到带有查询提示的命名查询。我不太喜欢用注释声明查询,因为实体类的冗长性很高,所以我在持久性单元的 jar 中添加了一个 orm.xml 文件,并执行了以下操作:

<!-- Fetch network elements -->
<named-query name="fetchNetworkElements">
    <query>select n from NetworkElement n</query>
    <lock-mode>NONE</lock-mode>
    <hint name="eclipselink.join-fetch" value="n.site" />
    <hint name="eclipselink.join-fetch" value="n.site.area" />
</named-query>

希望这能给任何与原始 JPQL 相同的缺点苦苦挣扎的人提供一些线索。

于 2010-02-25T12:05:04.653 回答