我创建了一个这样的JPQL: select class(c.field1)field1,sum(c.field2)field2,sum(c.field3)field3 from class c
现在有三个问题: 1)如果我可以使用synthax sum(c.field1)field1,我没有找到任何地方; 2)如果聚合查询可以有很多字段,我没有找到任何地方; 3)当我尝试执行此查询时,编译器返回一个Vector!奇怪的是,我无法定义将返回的字段类型,因为它是不同的(Long,Double和BigInteger),如果我尝试返回它返回的查询的值: [[Ljava.lang.Object; @ f7b046]
这是代码:
public Vector sumFilteredString(Class2 c2) {
String query="select sum(c1.field1) field1, sum(c1.field2) field2, sum(c1.field3) field3, sum(c1.field4) field4, sum(c1.field5) field5 from Class1 c1 WHERE c1.idClass2=c2.id";
Query q = getEntityManager().createQuery(query);
return (Vector)q.getResultList();
}
我尝试使用Vector,因为对我而言,如果我使用HashMap.get(“字段名称”)或Vector.get(位置)检索这些值并不重要,那么如果您的解决方案包括为我检索Vector,那么它就是同样的事情。
答案 0 :(得分:2)
看看the javadoc。方法getResultList()
返回List
。你不能假设返回的列表是Vector
。并且很有可能它不会成为Vector,因为自从JDK 1.2以来没有人再使用Vector。
您的方法应该返回List
,而不是Vector
。
返回列表的每一行都是Object[]
。这是由JPA规范定义的。并且该行的每个单元元素都是与映射中的字段类型对应的对象。 AFAIK,当你对一个定义为Long的字段求和时,你会得到一个Long作为结果。如果对一个定义为BigDecimal的字段求和,你将得到一个BigDecimal。
[[Ljava.lang.Object;@f7b046]
是在返回列表上调用toString()
的结果。它告诉你的是,该列表包含一个对象,toString()
为[Ljava.lang.Object;@f7b046
。这意味着该对象是一个对象数组,并且该数组的hashCode为f7b046
。