Hibernate Criteria API 多选

Posted

技术标签:

【中文标题】Hibernate Criteria API 多选【英文标题】:Hibernate Criteria aPI Multiselect 【发布时间】:2015-05-04 15:02:31 【问题描述】:

如果我使用 Hibernate Criteria API,例如:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
Root<OneEntity> entityOneRoot = criteriaQuery.from(OneEntity.class);
Root<TwoEntity> entityTwoRoot = criteriaQuery.from(TwoEntity.class);
criteriaQuery.multiselect(OneEntity, TwoEntity);

我是否需要使用 EQUAL-restriction(如 SQL 中的 ON-restriction)来使两个表(实体)之间的 ID 相等?因为两张表的笛卡尔积?

criteriaQuery.where(criteriaBuilder.equal(OneEntity.get("fk_id"), TwoEntity.get("id")));

我的意思是......在使用连接的 SQL 中,我们需要使用 on-clausule,例如:

select * from table_1 t1, table_2 t2 where t1.t2_id=t2.t1_id;

但我在 API Criteria 中找不到有关它的信息。

【问题讨论】:

【参考方案1】:

来自 JPA 2.1 规范,第 4.4.5 章加入

内连接可以通过使用笛卡尔来隐式指定 FROM 子句中的产品和 WHERE 中的连接条件 条款。在没有连接条件的情况下,这减少到 笛卡尔积。

这种通用连接方式的主要用例是当连接 条件不涉及映射的外键关系 到实体关系。

例子:

SELECT c FROM Customer c, Employee e WHERE c.hatsize = e.shoesize

一般来说,使用这种风格的内连接(也称为 theta-join) 不像显式定义的连接那样典型 关系。

由于 JPQL 的工作方式与 Criteria API 相同,因此您的查询中需要同等限制。

【讨论】:

以上是关于Hibernate Criteria API 多选的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Criteria API - 过滤集合属性

Hibernate Criteria API:获取 n 个随机行

Hibernate Criteria Api 是不是完全防止 SQL 注入

(懒惰)使用 Hibernate Criteria API 的 LEFT OUTER JOIN

Criteria API JPA Hibernate:外键上的不同选择

如何使用 JPA Criteria API / Hibernate 按 Case 语句分组