【问题标题】:Inner joins using Hibernate Criteria on non-primary key column在非主键列上使用 Hibernate Criteria 进行内部连接
【发布时间】:2016-10-15 21:33:21
【问题描述】:

我想使用 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

【问题讨论】:

标签: java sql hibernate hibernate-criteria


【解决方案1】:

要处理连接逻辑,您需要对每个表使用from,并在where 谓词中包含所有来自 on 子句的条件。

这是一个处理父子关系但没有外键关系的 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)。

【讨论】:

  • 感谢您的回答。我是这里的新手。我无法从对象中获取 getDb()。我找不到它。
  • 那是“任何持有你的数据库相关的东西”的伪代码。替换您使用的任何方式来获取您的实体经理。
猜你喜欢
  • 2015-06-15
  • 2013-11-07
  • 2018-03-29
  • 1970-01-01
  • 2012-08-20
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多