Java JPQL表联接查询

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

如何让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 = "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
。使用提示加入fetch
e.address
。也建议绕过缓存。谢谢你救了我的命/项目-磕头,磕头。也是一个关于连接获取和批处理提示的非常好的来源。我不明白提示是如何工作的。提示不应该说“e.middle='M'”而不仅仅是“e.middle”。否则,如何“提示”eclipselink仅在middle='M'上进行筛选?您仍将在查询中使用筛选:
e.middle=:middle
e.address.state=:state
。使用提示加入fetch
e.address
。也建议绕过缓存。谢谢你救了我的命/项目-磕头,磕头。