Hibernate query.unqueryResult();

qjf_Troy 发布于 2015/03/03 14:59
阅读 544
收藏 1

在使用hibernate4.3.8的时候,使用hibernate自带的session生成的query想通过sql语句,去查询出一个实体返回,回来就用下面的方式来实现,还有实现代码

public Object findBysql(final String sql){
		Query query = this.getSession().createSQLQuery(sql);
		Object obj = query.uniqueResult();
		return obj;
	}
public User login(String email, String password, int userType) {
		final String sql = "select * from user where email = '"+email+"' and password = '"+password+"' and usertype = '"+userType+"'";
		User user = (User) findBysql(sql);
		return user;
	}

但是query.uniqueResult();返回的不是一个object,而是一个Object[],数组元素恰好就是我的实体的每个属性,也就是我的表字段,现在我是想写一个BaseDao,这个是为什么呢,query.uniqueResult()的API不是说方法返回的是一个Object么,哪位大神能告知是为何呀?

 

 

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.swallretu.model.User
	at com.swallretu.dao.impl.userDaoImpl.login(userDaoImpl.java:34)
	at com.swallretu.service.impl.userServiceImpl.login(userServiceImpl.java:62)
	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:601)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
	at com.sun.proxy.$Proxy16.login(Unknown Source)
	at com.swallretu.action.userAction.login(userAction.java:87)
	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:601)
	at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:722)

 

 

加载中
0
王涛
王涛
//Query query = this.getSession().createSQLQuery(sql);
Query query = this.getSession().createQuery(sql);
Object obj = query.uniqueResult();
return obj;



0
开源中国首席撸管冠军
开源中国首席撸管冠军
13227829078 252975574@qq.com 楼主 这个  没遮住啊!
0
无忌
无忌

使用原生太SQL查询返回的对象需要进行对像属性映射,

使用hql,session.createQuery(hql) 才能返回对应的对象

0
搬砖的皮卡丘
搬砖的皮卡丘
query.uniqueResult();我记得是处理结果为单行单列的情况吧。如select count from xxx之类的。
0
飞炀
飞炀
解决办法其他人都说了,我就解释一下这个问题吧。
楼主没有仔细看API,API是说返回唯一的查询结果,而不是对查询结果组建对象。
返回的结果是由你的查询语句及创建Query的方式决定的,如果是用createSQLQuery()的方式创建的,会将查询结果组合成数组返回,因为hibernate不知道你这个查询结果应该对应哪个对象。如果用CreateQuery()的方式,如果查询了具体的列,会返回对应列的对象,如果查询类,才会返回对应类的对象。
0
JeffreyLin
JeffreyLin

createSQLQuery(sql).setResultTransformer(transformer).uniqueResult();

另外,不要拼接SQL参数,用:setParameter(i, p)

0
battyman
battyman
使用setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)来将结果转换为Map/Object数据,这样就可以使用get("字段名")来获取值了
0
qjf_Troy
qjf_Troy

引用来自“开源中国首席撸管冠军”的评论

13227829078 252975574@qq.com 楼主 这个  没遮住啊!

。。。

 

0
qjf_Troy
qjf_Troy

引用来自“飞炀”的评论

解决办法其他人都说了,我就解释一下这个问题吧。
楼主没有仔细看API,API是说返回唯一的查询结果,而不是对查询结果组建对象。
返回的结果是由你的查询语句及创建Query的方式决定的,如果是用createSQLQuery()的方式创建的,会将查询结果组合成数组返回,因为hibernate不知道你这个查询结果应该对应哪个对象。如果用CreateQuery()的方式,如果查询了具体的列,会返回对应列的对象,如果查询类,才会返回对应类的对象。
很感谢你的回答,虽然说前面已经又人给说了,但是很感谢你的耐心解释
0
qjf_Troy
qjf_Troy

引用来自“搬砖的皮卡丘”的评论

query.uniqueResult();我记得是处理结果为单行单列的情况吧。如select count from xxx之类的。
嗯,就是这样的,谢谢
返回顶部
顶部