【问题标题】:How to return list of key/value pair maps from JPQL query using EclipseLink?如何使用 EclipseLink 从 JPQL 查询返回键/值对映射列表?
【发布时间】:2020-08-08 22:53:36
【问题描述】:

我试过this解决方案:

List<javax.persistence.Tuple> result = entityManager.createQuery("select f.Id as Id, f.Project as Project from FirewallRequest f", javax.persistence.Tuple.class)
                                                    .getResultList();
result.get(0).get("Project");

我明白了:

java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class javax.persistence.Tuple ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; javax.persistence.Tuple is in unnamed module of loader java.net.URLClassLoader @7a9273a8)

所以它似乎返回 ListObjects 而不是 Tuples。 EclipseLink 不支持Tuple 还是有什么问题?

调试器显示它实际上是VectorObjects:

我正在使用 TomEE 8,它将 EclipseLink 2.7.4.v20190115 用于 JPA。我可以尝试使用 JPA Criteria Query,但我正在从 SQL 转换,将其转换为 JPQL 会更容易。

编辑 1

Here 是链接文章作者的回答,也表明这应该可行。

编辑 2

EclipseLink issue 已创建。

编辑 3

幸运的是,它适用于 JPA 标准查询 (CriteriaBuilder#createTupleQuery())。将 SQL 转换为此需要更多的工作,但至少它可以工作。

【问题讨论】:

    标签: jpa eclipselink jpql


    【解决方案1】:

    带有投影的查询总是返回List&lt;Object[]&gt;

    只要你不使用构造函数表达式

    select new x.y.Tuple(f.Id, f.Project) from FirewallRequest f
    

    但是你需要一个带有与投影匹配的构造函数的元组。

    【讨论】:

    • 所以链接示例中的代码(甚至有断言)永远不会工作?
    • EclipseLink 好像不支持。
    • 好吧,这就是我的想法,可以与 Hibernate 一起使用。
    • 哦,我刚刚看到另一个问题。项目是实体吗?
    • 不,它是实体中的字符串字段。
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2021-08-11
    • 2019-01-26
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多