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