【问题标题】:Hibernate Criteria aPI MultiselectHibernate Criteria API 多选
【发布时间】: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 中找不到有关它的信息。

【问题讨论】:

    标签: java hibernate postgresql-9.2 java-ee-7 jpa-2.1


    【解决方案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 相同,因此您的查询中需要同等限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-24
      • 2013-11-12
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      相关资源
      最近更新 更多