java - 根据 JPA 2 中的子参数过滤父级

标签 java hibernate jpa criteria jpql

我有一些单向 @OneToMany 关系,如下所示:

@Entity
@Table(name = "Parent")
public class Parent {

    @OneToMany
    @JoinColumn(name = "ParentID")
    private List<Child1> childList1;

    @OneToMany
    @JoinColumn(name = "ParentID")
    private List<Child2> childList2;
}

@Entity
@Table(name = "Child1")
public class Child1 {
    private int someProperty;
    // other properties
}

@Entity
@Table(name = "Child2")
public class Child2 {
    private int someProperty;
    // other properties
}

我正在尝试使用 child1.someProperty=10child2.someProperty=20 获取所有家长。有人可以帮忙吗? 我尝试使用加入:

Root<Parent> root = criteria.from(Parent.class);
ListJoin<Parent, Child1> join = root.join(Parent_.childList1);
criteriaBuilder.equal(join.get(Child1_.someProperty), 10);

但是,这会为每个 Child1 返回一个 Parent:

Parent----Child1(someProperty=10)
Parent----Child1(someProperty=10)

我希望结果是:

        /Child1(someProperty=10)
       /   
Parent/---Child1(someProperty=10)
      \
       \
        \Child2(someProperty=20)

有人可以帮忙解决这个问题吗?我更喜欢 JPA Criteria,不过 JPQL 也不错。
如果有帮助的话,我准备对我的实体结构进行微小的更改(微小更改,例如使关系成为双向的?) 谢谢。
顺便说一句,我使用 hibernate 作为 JPA 实现。

最佳答案

您必须在查询中使用setDistinct(true)。 您获得的结果是逐行映射到实体的有效联接结果。添加不同的将启用根聚合,导致我的父级拥有 N 个子级,因为我相信这就是您所期望的。

关于java - 根据 JPA 2 中的子参数过滤父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47009335/

相关文章:

java - SWT 图像连接或平铺/马赛克

java - Java 会注意到循环何时不会改变任何内容,或者我应该使用break 语句吗?

java - 为什么 getItem(position) 应该在泛型类(即 Custom ArrayAdapter<T>)内进行转换?

java - 将 HQL 解析为 AST 结构并将 AST 转换回 HQL

Java - Hibernate 调用 MySql 存储过程 - 警告消息

java - 我应该如何将未分页但已排序的 Pageable 传递到 Spring JPA 存储库?

java - 实现在接口(interface)和父类中声明的方法

java - Hibernate with SQLite 无法在数据库创建后第二次运行应用程序

spring - Spring Data REST 是否支持 JPA @Version?

java - 在@Query 注解中传递动态创建的查询(根据条件)