在非主键列上使用 Hibernate Criteria 进行内部连接
Inner joins using Hibernate Criteria on non-primary key column
我想使用 Hibernate Criteria 语言编写此查询。我是 Hibernate 的新手,无法将此查询转换为 Criteria 形式。我在 SO 上提到了很多可用的答案,但在我的例子中,我在不同的列而不是主键/外键列上使用内部连接。我提到了this,但还是做不对。
select TableA.columnA1, TableA.columnA2, TableA.columnA3, TableB.columnB1, TableC.columnC2 from TableA inner join TableB
on
cast(TableA.columnA3 as Integer) = TableB.columnB2
inner join
TableC
on
TableB.columnB3 = TableC.columnC1
为了处理连接逻辑,您需要对每个表使用 from
,并在 where
谓词中包含 on-clauses 中的所有条件。
这是一个处理父子关系但没有外键关系的 JPA 示例:
EntityManager em = getDb().getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Child> criteria = cb.createQuery(Child.class);
Root<Parent> p = criteria.from(Parent.class);
Root<Child> c = criteria.from(Child.class);
Predicate condition = cb.and(
cb.equal(c.get(Child_.parentId), p.get(Parent_.id)),
...
);
criteria.where(condition);
criteria.select(c);
criteria.orderBy(cb.asc(c.get(Child_.createDate)));
TypedQuery<Child> q = em.createQuery(criteria).setMaxResults(limit);
此处提供了一个 JPA 示例,因为 Hibernate 标准 API 已弃用,取而代之的是 JPA 标准 API(参见 Legacy Hibernate Criteria Queries)。
我想使用 Hibernate Criteria 语言编写此查询。我是 Hibernate 的新手,无法将此查询转换为 Criteria 形式。我在 SO 上提到了很多可用的答案,但在我的例子中,我在不同的列而不是主键/外键列上使用内部连接。我提到了this,但还是做不对。
select TableA.columnA1, TableA.columnA2, TableA.columnA3, TableB.columnB1, TableC.columnC2 from TableA inner join TableB
on
cast(TableA.columnA3 as Integer) = TableB.columnB2
inner join
TableC
on
TableB.columnB3 = TableC.columnC1
为了处理连接逻辑,您需要对每个表使用 from
,并在 where
谓词中包含 on-clauses 中的所有条件。
这是一个处理父子关系但没有外键关系的 JPA 示例:
EntityManager em = getDb().getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Child> criteria = cb.createQuery(Child.class);
Root<Parent> p = criteria.from(Parent.class);
Root<Child> c = criteria.from(Child.class);
Predicate condition = cb.and(
cb.equal(c.get(Child_.parentId), p.get(Parent_.id)),
...
);
criteria.where(condition);
criteria.select(c);
criteria.orderBy(cb.asc(c.get(Child_.createDate)));
TypedQuery<Child> q = em.createQuery(criteria).setMaxResults(limit);
此处提供了一个 JPA 示例,因为 Hibernate 标准 API 已弃用,取而代之的是 JPA 标准 API(参见 Legacy Hibernate Criteria Queries)。