使用SUM()的Java EE命名查询不起作用

时间:2014-12-17 21:04:39

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

我创建了一个简单的@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 个答案:

答案 0 :(得分:0)

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