java - JPA CriteriaQuery Join - 如何加入子元素?

标签 java hibernate jpa

我正在尝试使用标准查询来执行连接。

我的类结构是这样的:

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

相关文章:

java - 双向 ManyToOne 的问题

java - Pyspark - java.lang.OutOfMemoryError : when running as standalone application but NO error when running as docker

Java 图形用户界面问题

javascript - AAPT : No resource found that matches the given name: attr 'android:keyboardNavigationCluster'

hibernate - 这些 @Table(uniqueConstraints) 和 @Table(indexes) 注释是否相同?

spring - Hibernate命名策略

java - 所有 JPA 查询都找不到任何结果(即使数据存在于 MySQL 数据库中)

java - jaxws 网络服务。更改节点结构

java - 如何过滤列表的内容?

java - 在 Hibernate 实体中使主键与外键相同