【问题标题】:Java EE Named Query with SUM() is not working使用 SUM() 的 Java EE 命名查询不起作用
【发布时间】:2015-02-16 13:07:51
【问题描述】:

我创建了一个简单的@NamedQuery:

@NamedQuery(name = "Etap.findSum", query = "SELECT e.czas FROM Etap e WHERE e.stan=1")

这工作正常。字段e.czas 被映射为Integer,在DB2 数据库中属于INTEGER 类型。现在当我试图以这种方式改变它时:

@NamedQuery(name = "Etap.findSum", query = "SELECT SUM(e.czas) FROM Etap e WHERE e.stan=1")

它失败了,而且编辑器没有提示选择归档的e.czas作为查询的参数。 当我将归档的czas 类型更改为int 时,会给出提示,但查询仍然不起作用(从IBM Data Studio 控制台调用时它起作用)。

下面列出了我调用查询的方法(结果总是-1):

public Integer suma(){
        try{
            Query q = em.createNamedQuery("Etap.findSum");
            Integer suma = (Integer)q.getSingleResult();
            return suma;
        }
        catch(Exception e)
        {
            return -1;
        }

在这种情况下我做错了什么?

【问题讨论】:

  • “我总是得到 -1 作为结果”意味着有一个例外。帮自己一个忙,打印它的堆栈跟踪。
  • 它可能会自动扩大到Long,以防止您的整数总和对于该类型而言太大。鉴于SUM(...) 的文档明确列出了在数据库端发生的这种行为,ORM 可能不得不效仿。如果您确实确信您的结果可以包含在 int 中,请在计算总和后将其强制转换。
  • @mustaccio 你是对的,我一直在寻找堆栈跟踪而不使用 try-catch,但显然,我错过了一些东西
  • @Clockwork-Muse 你的回答是对的,问题出在演员表上:引起:java.lang.ClassCastException:java.lang.Long 不能转换为java.lang.Integer引起:java。 lang.ClassCastException:java.lang.Long 无法转换为 java.lang.Integer。结果,查询与 Long 完美配合,我还发现,使用 nativeQuery 解决了问题(将结果转换为整数时)
  • 其实我可能错了。它将小整数表示为大整数,结果分别是短整数和整数等价。文档的其余部分说明该类型应保持不变。所以数据库不太可能这样做......现在,ORM 可能会将所有内容都转换为 long 以防万一......

标签: sql jakarta-ee db2 jpql named-query


【解决方案1】:

这可能是因为 ORM 会自动扩展结果,因为预期结果会变成 Long,而不是 Integer
请注意,如果源列是Short(等效),则为SUM(...) widens the result to an Integer in all cases。文档没有明确提到在Integer 源列的情况下会发生什么,但我想在结果足够大的情况下数据库会自动加宽它。
然后,ORM 必须通过确保它可以处理 long 来解决这种潜在的行为 - 因此它将其强制转换为该类型,除非明确声明结果是安全的(通过将其强制转换为 db 上的Integer)。

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 2015-02-22
    • 2018-11-08
    • 2016-10-26
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多