EclipseLink JPQL(Glassfish v3):加入fetch语法问题?

时间:2010-02-23 16:38:11

标签: jpa eclipselink jpql

使用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。

我很感激任何帮助!

罗德里戈

2 个答案:

答案 0 :(得分:4)

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

- 戈登约克

答案 1 :(得分:0)

好吧,似乎不允许在JPQL中为一个提取连接添加别名。确实..它适用于Hibernate,因为它支持通过HQL进行别名,并且允许您向JPA Query对象发出HQL。

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

<!-- 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缺点的人提供一些线索。