繁体   English   中英

JPA CriteriaQuery Join-如何在子元素上进行联接?

[英]JPA CriteriaQuery Join - how to join on a subelement?

我正在尝试使用条件查询来执行联接。

我的课程结构是这样的:

@Entity
class Parent {
  Intermediate intermediate;
}

@Entity
class Intermediate {
  Set<Child> children
}

@Entity
class Child {
  String someProperty;
}

我正在尝试让所有父母中至少有一个孩子具有匹配的属性,但无法弄清楚如何加入。 如果没有中间对象,那将很容易:

// 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]

在此示例中,我可以为孩子计算Path对象,但是JPA似乎不想让我使用Path对象而不是Root对象进行Join。

谁能帮我吗? 谢谢

我认为您的课程必须是这样的。

@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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM