首页 > 解决方案 > 如何使用 CriteriaBuilder 执行具有多个条件的联接?

问题描述

我有两个 JPA 实体类 (MyEntityAttribute),并且想知道如何使用它CriteriaBuilder来执行具有多个条件的内部联接。

我想要这个:

SELECT e.id
FROM my_entity e
INNER JOIN my_attribute a
ON e.id = a.event_id
AND a.key = "special-key"   // I want to add this part.

而不仅仅是这个:

SELECT e.id
FROM my_entity e
INNER JOIN my_attribute a
ON e.id = a.event_id

我可以从以下CriteriaBuilder代码生成:

var cb = entityManager.getCriteriaBuilder();
var cq = cb.createQuery(Event.class);

var entity = cq.from(MyEntity.class);
entity.join(MyEntity_.attributes);
cq.select(entity);

return entityManager.createQuery(cq).getResultList();

有问题的课程是:

MyEntity班级:

@Entity
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany
    @JoinColumn(name = "my_attribute_id")
    private List<MyAttribute> attributes;

MyAttribute班级:

@Entity
public class MyAttribute {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String key;
    private String value;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private MyEntity entity;

如何使用额外的AND a.key = "special-key"using生成第一个片段CriteriaBuilder

请注意,在我的内部联接示例中,我可以使用下面的代码,但我想知道如何专门将AND条件添加到联接中。

var cb = entityManager.getCriteriaBuilder();
var cq = cb.createQuery(Event.class);

var entity = cq.from(MyEntity.class);
entity.join(MyEntity_.attributes);

// Add these three lines.
var join = event.join(MyEntity_.attributes);
var pred = cb.equal(join.get(MyAttribute_.key), "special-key");
cq.where(pred);

cq.select(entity);

return entityManager.createQuery(cq).getResultList();

标签: javaspring-data-jpahibernate-criteriacriteria-api

解决方案


推荐阅读