【问题标题】:Hibernate and Criteria API returns Object array instead of TupleHibernate 和 Criteria API 返回 Object 数组而不是 Tuple
【发布时间】:2016-03-05 02:57:00
【问题描述】:

我正在试用 Criteria API,但遇到了一个奇怪的元组问题。

我正在构建一个与此处描述的查询非常相似的查询: 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));
}

这段代码可以正确编译,但是当我到达for 循环时,我得到了一个ClassCastExceptionjava.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>

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

【问题讨论】:

  • 代码是正确的,这就是 Tuple 的用途。在您的 JPA 提供程序上提出错误

标签: java hibernate jpa


【解决方案1】:

我试过你的例子,它工作得很好。在我的 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 上添加问题。

【讨论】:

  • 我对 5.0.4.FINAL 也有同样的问题。将尝试运行您的测试并报告回来。您使用什么数据库进行测试?我在想问题可能出在我正在使用的 Weblogic/Oracle DB 设置中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2022-01-27
  • 2012-01-19
  • 2018-05-24
相关资源
最近更新 更多