我正在尝试Criteria API,并且面临着与Tuples的奇怪问题。
我正在构建一个类似于此处描述的查询: https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html_single/#querycriteria-tuple
但由于某种原因,结果列表实际上是List<Object[]>
而不是List<Tuple>
,所以我的代码在运行时失败了。
我可以轻松地解决问题并更改列表上的迭代,以便它在运行时工作,但我想了解我在这里做错了什么。
以下是我的查询代码:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<Users> usersRoot = cq.from(Users.class);
Path<String> namePath = usersRoot.get(Users_.fullName);
Path<Integer> employeeIdPath = usersRoot.get(Users_.employeeId);
cq.multiselect(namePath, employeeIdPath);
List<Tuple> resultList = entityManager.createQuery(cq).getResultList();
List<String> names = new ArrayList<>();
for (Tuple tuple : resultList) {
names.add(tuple.get(namePath));
}
此代码编译正确,但当我到达ClassCastException
循环时,我收到for
:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to javax.persistence.Tuple
调试确认返回的结果列表确实包含Object[]
而不是Tuple
,因此违反了API合同。
我的hibernate maven依赖项:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.21.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>5.0.4.Final</version>
</dependency>
此代码作为EJB 3.1应用程序部署到Weblogic 12.1.3容器,底层数据库是Oracle 12。
答案 0 :(得分:0)
我试过你的例子,它运作得很好。查看我的GitHub存储库中的this test:
doInJPA(entityManager -> {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<BlogEntityProvider.Post> postRoot = cq.from(BlogEntityProvider.Post.class);
Path<Long> idPath = postRoot.get("id");
Path<String> titlePath = postRoot.get("title");
cq.multiselect(idPath, titlePath);
List<Tuple> resultList = entityManager.createQuery(cq).getResultList();
for (Tuple tuple : resultList) {
Long id = tuple.get(idPath);
String title = tuple.get(titlePath);
}
});
这是5.0.3.Final
。如果这不适用于4.2.21
,请在Hibernate Jira上添加问题。