Sql 带SUM()的Java EE命名查询不工作

Sql 带SUM()的Java EE命名查询不工作,sql,jakarta-ee,db2,jpql,named-query,Sql,Jakarta Ee,Db2,Jpql,Named Query,我创建了一个简单的@NamedQuery: @NamedQueryname=Etap.findSum,query=SELECT e.czas FROM Etap e其中e.stan=1 这很好用。字段e.czas被映射为整数,在DB2数据库中为整数类型。现在,当我试图以这种方式改变它时: @NamedQueryname=Etap.findSum,query=从Etap e中选择SUMe.czas,其中e.stan=1 它失败了,而且编辑器没有给出选择字段e.czas作为查询参数的提示。 当我将字

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

@NamedQueryname=Etap.findSum,query=SELECT e.czas FROM Etap e其中e.stan=1

这很好用。字段e.czas被映射为整数,在DB2数据库中为整数类型。现在,当我试图以这种方式改变它时:

@NamedQueryname=Etap.findSum,query=从Etap e中选择SUMe.czas,其中e.stan=1

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

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

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

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

这可能是因为ORM正在自动加宽结果,以预期结果将变为长而不是整数。 请注意,如果源列是短的等效列,则。文档没有明确提到在整数源列的情况下会发生什么,但是我可以想象在结果足够大的情况下db会自动加宽它。
然后,ORM必须通过确保它能够处理long-so将其强制转换为该类型来考虑这种潜在行为,除非通过将其强制转换为db上的整数来明确说明结果是安全的。

我总是得到-1,因此意味着存在异常。帮你自己一个忙,打印它的堆栈跟踪。它可能会自动加宽到Long,以防止整数之和对于类型来说太大。鉴于文件的总和。。。显式地列出了发生在db端的这种行为,ORM可能也会这样做。如果你真的确信你的结果可以包含在一个整数中,那么在求和后将其转换为整数。@mustaccio你是对的,我一直在查看堆栈跟踪,但没有尝试捕获,但显然我错过了something@Clockwork-缪斯你的回答是对的,问题是强制转换:原因:java.lang.ClassCastException:java.lang.Long无法强制转换为java.lang.Integer原因:java.lang.ClassCastException:java.lang.Long无法强制转换为java.lang.Integer。我还发现,只要结果正确,使用nativeQuery就可以解决将结果转换为整数的问题。实际上,我可能错了。它将小整数转换为大整数,结果分别是短整数和整数等价。文档的其余部分说明该类型应保持不变。所以db不太可能这么做。。。现在,ORM可能会把所有的事情都拖得很长,以防万一。。。