我正在尝试使用标准查询来执行连接。
我的类结构是这样的:
@Entity
class Parent {
Intermediate intermediate;
}
@Entity
class Intermediate {
Set<Child> children
}
@Entity
class Child {
String someProperty;
}
我试图让所有 parent 至少有一个 child 拥有匹配的属性(property),但无法弄清楚如何加入。如果中间对象不存在,那将非常简单:
// Here, Intermediate doesn't exist - Parent has the Set<Child> property
CriteriaBuilder builder = ...
CriteriaQuery<Parent> query = ...
Root<Parent> root = query.from( Parent.class );
Join<Parent, Child> join = root.join( "child" );
Path path = join.get( "someProperty" );
Predicate predicate = builder.equal( path, "somevalue" );
但是对中间实体这样做会破坏它
CriteriaBuilder builder = ...
CriteriaQuery<Parent> query = ...
Root<Parent> root = query.from( Parent.class );
Join<Parent, Child> join = root.join( "intermediate.child" ); <-- Fails
Caused by: java.lang.IllegalArgumentException: Unable to resolve attribute [intermediate.child] against path
at org.hibernate.ejb.criteria.path.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:120) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final]
at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:229) ~[hibernate-entitymanager-4.2.0.Final.jar:4.2.0.Final]
at org.hibernate.ejb.criteria.path.AbstractFromImpl.join(AbstractFromImpl.java:411) ~[hiberna
te-entitymanager-4.2.0.Final.jar:4.2.0.Final]
在这个例子中,我可以为 child 算出 Path 对象,但 JPA 似乎不想让我使用 Path 对象而不是 Root 对象来创建 Join。
谁能帮帮我?谢谢
最佳答案
我认为您的类(class)需要像这样。
@Entity
class Parent {
@OneToOne
Intermediate intermediate;
}
@Entity
class Intermediate {
@OneToOne(mappedBy="intermediate")
Parent parent;
@OneToOne
Set<Child> children
}
@Entity
class Child {
String someProperty;
}
然后你可以按照下面的方式进行连接。
CriteriaBuilder builder = ...
CriteriaQuery<Parent> query = ...
Root<Parent> root = query.from( Parent.class );
Join<Parent, Child> join = root.join("intermediate").join("children");
关于java - JPA CriteriaQuery Join - 如何加入子元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22867822/