【问题标题】:Returning a List of non entity objects with TypedQuery where value can be NULL使用 TypedQuery 返回非实体对象列表,其中值可以为 NULL
【发布时间】:2012-08-17 07:40:37
【问题描述】:

我正在查看this example of JPQL SELECT,它说您可以返回List<Object[]>

TypedQuery<Object[]> query = em.createQuery(
    "SELECT c.name, c.capital.name FROM Country AS c", Object[].class);
List<Object[]> results = query.getResultList();
for (Object[] result : results) {
    System.out.println("Country: " + result[0] + ", Capital: " +     result[1]);
}

现在我这样做是因为:

因为托管实体对象的构造有一些开销,所以返回非实体对象的查询,如上面的两个查询,通常更有效。此类查询主要用于有效地显示信息。对于需要托管实体对象的更新或删除实体对象的操作,它们的生产力较低。

现在我有类似的实体,除了实体 Country 中的实体 Capital 可以为 NULL。当我想获取List&lt;Object[]&gt; 时,它无法正常工作,因为它无法从 Capital 访问属性名称(正如我所说的 Capital 可以为 NULL)。我希望如果 Capital 为 NULL,则 Object[] 应该包含该属性的 NULL 值。

【问题讨论】:

    标签: jakarta-ee jpql


    【解决方案1】:

    您可以使用 CASE 语句:

    "SELECT c.name, CASE WHEN (c.capital IS NULL) THEN NULL ELSE c.capital.name END FROM Country AS c"
    

    【讨论】:

    • 如果使用您的语句,我会得到:java.lang.ClassCastException: org.hibernate.hql.internal.ast.tree.SqlNode cannot be cast to org.hibernate.hql.internal.ast .tree.SelectExpression
    • 你使用的是什么版本的休眠?
    • 也许您可以尝试此链接中的建议以使用否定条件(即 IS NOT NULL 代替)forum.hibernate.org/…
    • 我使用的是休眠 4.0.1。我已经否定了,它现在可以工作了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2019-09-18
    • 1970-01-01
    • 2021-11-04
    • 2015-11-23
    • 1970-01-01
    相关资源
    最近更新 更多