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
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xl.entity.Users
提问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 Users
as public Users(String name, String password)
and change query to
您可以为Users
as创建另一个构造函数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 ResultTransformer
will create a User
object 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];