java - 如何使用 CriteriaBuilder 执行具有多个条件的联接?
问题描述
我有两个 JPA 实体类 (MyEntity
和Attribute
),并且想知道如何使用它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();
解决方案
推荐阅读
- date - Ansible 时间转换
- ios - React 原生 iOS 深度链接;如何在 url 中使用 `@` 字符
- php - 实例化一个其类没有 __construct 方法的对象
- python - 为什么 numpy 在哪里不断提高除以零遇到?
- java - 即使redis中存在数据,Springboot redis @cacheable也总是返回null
- outlook - 超级用户可以取消(而不是删除)其他用户创建的会议吗?
- firebase - Firebase + BigQuery - 重复事件
- javascript - Angular DI:注入具有多个参数值的服务
- angular - 如何在打字稿中导入css
- excel - 试图将整个工作簿粘贴到另一个工作簿的底部