【发布时间】: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