Java JPQL表联接查询
如何让JPA&JPQL向RDBMS传递完整的连接查询?比如说,Java JPQL表联接查询,java,hibernate,jpa-2.0,eclipselink,Java,Hibernate,Jpa 2.0,Eclipselink,如何让JPA&JPQL向RDBMS传递完整的连接查询?比如说, SELECT e FROM Employee e WHERE a.runkey = e.runkey AND e.middle = 'M' AND a.state = 'MA' 使用以下Employee类 @Entity public class Employee implements Serializable { blah ... blah @OneToOne @JoinColumn( name
SELECT e
FROM Employee e
WHERE a.runkey = e.runkey
AND e.middle = 'M'
AND a.state = 'MA'
使用以下Employee类
@Entity
public class Employee implements Serializable {
blah ... blah
@OneToOne
@JoinColumn(
name = "runkey",
referencedColumnName = "runkey",
insertable=false, updatable=false)
private Address address;
}
和JPQL
SELECT e
FROM Employee e
INNER JOIN FETCH e.address AS a
WHERE a.state = :state
AND e.middle = :middle
我能够让Hibernate JPA按预期提取数据
然而,eclipselink发出嘎嘎声,它无法遍历相关字段“地址”
如果是这样的话,那么我应该如何设计Employee实体,以及我应该如何表达JPQL,以便让eclipselink在两个表上执行带有WHERE过滤器的表联接
(咆哮:否则EclipselinkJPA不比JDO好!!!)
~
进一步编辑:这篇文章对我的情况有什么意义吗……问题在于,您试图为一个连接获取别名,而根据JPQL规范,这是不允许的。Hibernate允许这样做。 使用EclipseLink仍然可以获得所需的行为 请看以下帖子:
问题在于,您试图为一个连接获取别名,而根据JPQL规范,这是不允许的。Hibernate允许这样做。 使用EclipseLink仍然可以获得所需的行为 请看以下帖子:
什么是
n
?例外情况是什么(复制stacktrace)?JOIN FETCH应该可以工作。不是n而是e-已更正。“JOIN FETCH应该可以工作”-仅适用于Hibernate JPA或未筛选的eclipselink。当我将提供者更改为eclipselink时,它失败了,因为eclipselink不允许我对相关字段进行筛选。您是否仔细检查了您的导入是否为JPA?e、 例如,确保导入了javax.persistence.OneToOne
而不是org.hibernate.mapping.OneToOne
?是的,实体中只有javax.persistence-因为实体dto在GWT/RestyGWT和JPA(以及JAXB和JAX-RS)之间共享,GWT不允许我在dto中导入hibernate。仅供参考,GWT要求所有类的继承链都具有Java源代码,而我无法为Hibernate提供这一点。因此,实体dto中肯定没有hibernate导入。什么是n
?例外情况是什么(复制stacktrace)?JOIN FETCH应该可以工作。不是n而是e-已更正。“JOIN FETCH应该可以工作”-仅适用于Hibernate JPA或未筛选的eclipselink。当我将提供者更改为eclipselink时,它失败了,因为eclipselink不允许我对相关字段进行筛选。您是否仔细检查了您的导入是否为JPA?e、 例如,确保导入了javax.persistence.OneToOne
而不是org.hibernate.mapping.OneToOne
?是的,实体中只有javax.persistence-因为实体dto在GWT/RestyGWT和JPA(以及JAXB和JAX-RS)之间共享,GWT不允许我在dto中导入hibernate。仅供参考,GWT要求所有类的继承链都具有Java源代码,而我无法为Hibernate提供这一点。因此,实体dto中绝对没有hibernate导入。也是一个关于连接获取和批处理提示的非常好的来源。我不明白提示是如何工作的。提示不应该说“e.middle='M'”而不仅仅是“e.middle”。否则,如何“提示”eclipselink仅在middle='M'上进行筛选?您仍将在查询中使用筛选:e.middle=:middle
和e.address.state=:state
。使用提示加入fetche.address
。也建议绕过缓存。谢谢你救了我的命/项目-磕头,磕头。也是一个关于连接获取和批处理提示的非常好的来源。我不明白提示是如何工作的。提示不应该说“e.middle='M'”而不仅仅是“e.middle”。否则,如何“提示”eclipselink仅在middle='M'上进行筛选?您仍将在查询中使用筛选:e.middle=:middle
和e.address.state=:state
。使用提示加入fetche.address
。也建议绕过缓存。谢谢你救了我的命/项目-磕头,磕头。