休眠:使用CriteriaQuery查询以从多个表中选择值

问题描述

比方说,我有一个类似的查询

Select a.valA,b.valB
from tableA a join tableB b on a.joinCol = b.joinCol
where a.someCol = 1.

我想在对数据库的一次查询中使用Hibernate(和Spring Data)执行它。我知道,我只会写

Query query = em.createquery(...);
List<Object[]> resultRows = (List<Object[]>)query.getResultList();

但是我的问题是-是否可以以类型安全的方式(例如使用CriteriaQuery来做到这一点?如您所见,困难在于,我需要从不同的表中选择值。有什么方法可以做到这一点?

解决方法

一个简单的示例,其中一个雇员与他可能拥有的多个工作有许多关系:

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
Root<TableA> root = criteria.from(TableA.class);
Path<Long> qId = root.get("id");
Path<String> qTitle = root.get("title");
Join<TableA,TableB> tableTwo = root.join("joinColmn",JoinType.INNER);

criteria.multiselect(qId,qTitle,tableTwo);
List<Tuple> tuples = session.createQuery(criteria).getResultList();
for (Tuple tuple : tuples)
{
   Long id = tuple.get(qId);
   String title = tuple.get(qTitle);
   TableB tableB= tuple.get(tableTwo);
}

但是看到这里还有一个替代答案: JPA Criteria API - How to add JOIN clause (as general sentence as possible)