加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:11:43 所属栏目:Java 来源:网络整理
导读:我正在尝试Criteria API,并且面临着与Tuples的奇怪问题. 我正在构建一个类似于此处描述的查询: https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html_single/#querycriteria-tuple 但由于某种原因,结果列表实际上是List Object []而不是List Tupl
我正在尝试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));
}

这段代码编译正确,但是当我到达for循环时,我得到一个ClassCastException:java.lang.ClassCastException:[Ljava.lang.Object;无法转换为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.

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读