【问题标题】:Query for parent entity using two fields from child entity using CriteriaQuery使用 CriteriaQuery 使用来自子实体的两个字段查询父实体
【发布时间】:2021-04-26 19:35:38
【问题描述】:

拥有以下实体

class Parent {
    @Id
    Long id;
    String name;
    @OneToMany 
    @JoinColumn(name="parent_fk")
    List<Child> children; 
}

class Child {
    @Id
    Long id;
    String sex; //male, female
    String name;
}

您将如何使用 CriteriaBuilder 构造以下查询?

SELECT * FROM Parent p JOIN Child c ON p.id = c.parent_fk WHERE c.sex='male' AND (c.name = 'Tom' OR c.name='Jim')

谢谢

更新: 所以我的错误是,而不是这样做

Join<Parent, Child> c = p.join("children");
Predicate predicate = builder.or(
     builder.equal( c.get("name"), name1 ),
     builder.equal( c.get("name"), name2 )
);

我在做:

Predicate predicate = builder.or(
     builder.equal( p.join("children").get("name"), name1 ),
     builder.equal( p.join("children").get("name"), name2 )
);

这导致了与子表的 2 个内部连接,每个 p.join 我正在使用一个

【问题讨论】:

    标签: hibernate jpa spring-data-jpa criteria-api


    【解决方案1】:

    试试这样的:

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Parent> criteria = builder.createQuery(Parent.class);
    
    Root<Parent> p = criteria.from(Parent.class);
    Join<Parent, Child> c = p.join("children");
    
    criteria.select(p);
    
    ParameterExpression<String> name1 = builder.parameter( String.class );
    ParameterExpression<String> name2 = builder.parameter( String.class );
    ParameterExpression<String> sex = builder.parameter( String.class );
    
    Predicate predicate = builder.or(
      builder.equal( c.get("name"), name1 ),
      builder.equal( c.get("name"), name2 )
    );
    
    predicate = builder.and(
      builder.equal( c.get("sex"), sex ),
      predicate
    );
    
    criteria.where(predicate);
    
    List<Parent> result = entityManager.createQuery( criteria )
      .setParameter( name1, "Tom" )
      .setParameter( name2, "Jim" )
      .setParameter( sex, "male" )
      .getResultList();
    
    

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 2018-12-08
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 2017-06-30
      相关资源
      最近更新 更多