2016-06-15 66 views
2

我想使用Hibernate Criteria语言编写此查询。我对Hibernate相当陌生,不能将这个查询转换为Criteria表单。我提到了许多可用的答案,但在我的情况下,我在不同的列上使用内部连接而不是主键/外键列。我提到this,但仍然不能正确。在非主键列上使用Hibernate标准的内部连接

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 
+0

到目前为止请显示您的代码。阅读[mcve] s。 – philipxy

回答

2

要处理的加盟逻辑,你会想用from为每个表,包括所有的条件从where谓词上的条款。

这里是一个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)。

+0

感谢您的回答。我在这里是一个新手。我无法从对象中获取getDb()。我找不到它。 – SiMemon

+0

这是“无论持有你的数据库相关的东西”的伪代码。用您用来获取实体经理的任何方式替代。 – Rob