Hibernate和Criteria API返回Object数组而不是Tuple

dag*_*erx 5 java hibernate jpa

我正在尝试使用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));
}
Run Code Online (Sandbox Code Playgroud)

这段代码可以正确编译,但是ClassCastException到达for循环时我得到了:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to javax.persistence.Tuple

调试确认返回的结果列表确实包含Object[],而不包含Tuple,从而破坏了API合同。

我的休眠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>
Run Code Online (Sandbox Code Playgroud)

此代码作为EJB 3.1应用程序部署到Weblogic 12.1.3容器,基础数据库是Oracle 12。

Vla*_*cea 0

我尝试了你的例子,效果很好。在我的 GitHub 存储库上查看此测试:

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

这是与5.0.3.Final. 如果这不起作用,请在Hibernate Jira4.2.21上添加问题。