使用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。
我很感激任何帮助!
罗德里戈
答案 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缺点的人提供一些线索。