Sum运算符和HashMap对象作为结果

时间:2012-02-17 14:58:08

标签: java jpql

我创建了一个这样的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,那么它就是同样的事情。

1 个答案:

答案 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