java.lang.ClassCastException: [Ljava.lang.Object; 无法转换为 com.xl.entity.Users

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18584595/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 09:15:39  来源:igfitidea点击:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xl.entity.Users

javahibernatehql

提问by user2640521

Here is the code:

这是代码:

public Users login(String username) {
        Users user=null;
        try {
            String hql="select user.name,user.password from Users user where user.name=:name";
            Query query = session.createQuery(hql);
            query.setString("name", username);
            user=(Users) query.list().get(0);
        } catch (HibernateException e) {
            e.printStackTrace();
        }
        return user;
    }

Error:

错误:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xl.entity.Users
    at com.xl.impl.HouseDaoImpl.login(HouseDaoImpl.java:51)
    at com.xl.biz.HouseBiz.login(HouseBiz.java:25)
    at com.xl.Servlet.UserServlet.doGet(UserServlet.java:25)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)

(Translations courtesy Google Translate)

(翻译由谷歌翻译提供)

回答by Alex

You can create another constructor for Usersas public Users(String name, String password)and change query to

您可以为Usersas创建另一个构造函数public Users(String name, String password)并将查询更改为

String hql="select new yourpath.Users(user.name,user.password) from Users user
where user.name=:name";

回答by Gaurav Gupta

Since query.list()returns List, and here you are casting the content of the list to type User, Now, as exception says Object can not be cast to User. Please make sure, are you getting the content in form of user.

由于query.list()返回List,在这里您将列表的内容转换为类型User,现在,正如异常所说Object can not be cast to User。请确保您是否以用户的形式获取内容。

You can make a check:

您可以进行检查:

 if(query.list() instanceOf User){
        // can cast to user.
 }else{
        // can not cast to User.
 }

回答by Luca Basso Ricci

You need a ResultTransformerbacked on root entity in this manner

您需要以这种方式支持根实体的ResultTransformer

Query query = session.createQuery(hql);
query.setResultTransformer(RootEntityResultTransformer.INSTANCE);
query.list()

Using a projection (the select list) will produce a result of Object[]type: the ResultTransformerwill create a Userobject and maps raw Object[]to correct User's property

使用投影(选择列表)将产生以下Object[]类型的结果:ResultTransformer将创建一个User对象并将 raw 映射Object[]到 CorrectUser的属性

回答by Ean V

If you need the Users object, edit your query to be like

如果您需要用户对象,请将您的查询编辑为

String hql="from Users user where user.name=:name";

Otherwise the result will be an array of objects so you need to either use a transformer or simply cast it to object[]:

否则结果将是一个对象数组,因此您需要使用转换器或简单地将其转换为 object[]:

String hql="select user.password from Users user where user.name=:name";
Query query = session.createQuery(hql);
query.setString("name", username);
Object[] result =(Object[]) query.list().get(0);
String password = result[0];