2013-05-01 261 views
0
"select c.type, c.date, sum(c.amount) from CustomerPayment c where c.date like '%" + year + "' and c.type='Cash'" 

上面的hibernate查询给出了ClassCastError,因为我的select语句。休眠查询 - ClassCastError

我怎样才能以正确的方式写它?是否需要使用总结标准?以上查询有什么好处?我很困惑。

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to CustomerPayment 
    at tekirmobile.clController.getTotalCash(clController.java:163) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 

我得到,因为您选择三个属性的上述查询

回答

1

这些错误:c.typec.datesum(c.amount),这意味着每个结果将是一个对象[],其中包含每个选择的三个特性。您不能将其转换为CustomerPayment。

如果CustomerPayment有一个兼容的构造函数,你可以不喜欢

select new CustomerPayment(c.type, c.date and sum(c.amount)) ... 

,或者你可能会做这样的事情

"select c, c.type, c.date, sum(c.amount) from CustomerPayment c ... " 

Object[] result = query.uniqueResult(); 
CustomerPayment payment = (CustomerPayment) result[0]; 

但是,那么我不知道你需要的总和因为尽管如此,你并没有在where子句中的任何地方使用总和。它有点不清楚你想完成什么。如在中,你想要uniqueResult的结果是什么?一个CustomerPayment实例?或值的列表?

+0

,但我选择所有他们得到正确的结果 – user2341009 2013-05-01 23:02:59

+0

请尝试添加在您执行查询,并访问结果的代码,通过.LIST()或.uniqueResult():) – JustDanyul 2013-05-01 23:11:03

+0

我用uniqueResult()但它仍然会导致问题 – user2341009 2013-05-01 23:12:40

0

其实它不会返回Object[]根据另一个答案。它将返回Object[][]。它的每个数组将包含一个数组,其中包含c.type, c.date & sum(c.amount)的3个条目。

请参考下图,为了便于理解:

----------------------------------- 
     | 0 | 1 | 2 | 
----------------------------------- 
    0 | c.type1 | c.date1 | sum | 
----------------------------------- 
    1 | c.type2 | c.date2 | sum | 
----------------------------------- 
    2 | c.type3 | c.date3 | sum | 
----------------------------------- 

让我知道你的确切要求,这样我可以建议你合适的解决方案。