ClassCastException当我查询 [英] ClassCastException when i query

查看:60
本文介绍了ClassCastException当我查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

  public float getTotalCash(String year){


CustomerPayment cp = null;

this.session = HibernateUtil.getSessionFactory()。getCurrentSession();


尝试{
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery(从CustomerPayment c中选择c.type,c.date,sum(c.amount),其中c.date就像'%'+ year +''和c.type ='Cash );
cp =(CustomerPayment)q.uniqueResult();
} catch(Exception e){
e.printStackTrace();
}

return totalCashAmount = cp.getAmount();

}

但是,它给出了ClassCastException。

堆栈跟踪:

  java.lang.ClassCastException:[Ljava .lang.Object;无法转换为tekirmobile.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)$ b $ at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
at com。 sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)在javax.faces.event.MethodExpressionActionListener.processAction处使用
(MethodExpressionActionListener.java:148)在javax.faces.event处使用
。 ActionEvent.processListener(ActionEvent.java:88)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
at javax.faces.compone nt.UICommand.broadcast(UICommand.java:300)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot。
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org .apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina .core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase .invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve .java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118 )
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
在org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:589)
在org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:312)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)$ b $在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)$ b $在java.lang。线.run(Thread.java:679)

可能是什么原因?为什么我得到这个错误?是否有浮动返回的错误原因?可能是什么原因?为什么我得到这个错误?可能是什么原因?为什么我得到这个错误?

解决方案

您正在选择 c 的部分内容,而不是选择 c 对象。 下面是一些有效的HQL示例。我认为这会按照你想要的方式工作:

 from CustomerPayment c where c.date like'%+ year + '和c.type ='现金'

但是,这样做不是很好,因为你可以在这里做一个SQL注入攻击。你应该把 year 变成一个变量。 这里有一些如何做到这一点的例子


i have below code:

public float getTotalCash(String year) {


        CustomerPayment cp = null;

        this.session = HibernateUtil.getSessionFactory().getCurrentSession();


        try {
            org.hibernate.Transaction tx = session.beginTransaction();
            Query q = session.createQuery("select c.type, c.date, sum(c.amount) from CustomerPayment c  where c.date  like '%" + year + "' and c.type='Cash'");
            cp = (CustomerPayment) q.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return totalCashAmount = cp.getAmount();

    }

However, it gives ClassCastException.

Stack trace:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to tekirmobile.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)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
    at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
    at javax.faces.component.UICommand.broadcast(UICommand.java:300)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:679)

What might be the reason? Why i get this error? Is there a reason of that error because of float returning?What might be the reason? Why i get this error? What might be the reason? Why i get this error?

解决方案

You are selecting parts of the c instead of SELECTing a c object. Here are some examples of valid HQL. I think this will work the way you want:

"from CustomerPayment c  where c.date  like '%" + year + "' and c.type='Cash'"

But, that's not really great to do either because you can do a sql injection attack here. You should turn that year into a variable. Here are a bunch of examples of how to do that.

这篇关于ClassCastException当我查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆