关于使用原生SQLQuery查询抛出类转换异常的问题

wangzhihao_2006 2009-02-23 12:16:13
请高手帮我看一下在Hibernate中查询的问题(代码如下)
随便建一个Person表,放几条数据进去
public static void main() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = null;
List<Person> list = new ArrayList<Person>();
try {
session = sf.openSession();
session.beginTransaction();
list = session.createSQLQuery("select * from person").list();
for(Person p : list){
System.out.println(p.getName());
}
for (Iterator iter = list.iterator();iter.hasNext();) {
Person p = (Person)iter.next();
System.out.println(p.getName());
}

session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
if (session.isOpen()) {
session.close();
}
HibernateUtil.close(sf);
}
}

抛出异常:(实在想不通哪里转换有问题)
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.wzh.hibernate_one2one.Person
at com.wzh.hibernate_one2one.Application.main(Application.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
00:11:56,968 WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/D:/UserLib/HibernateLib/env/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
Hibernate: select * from person
...全文
275 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangzhihao_2006 2009-02-24
  • 打赏
  • 举报
回复
多谢多谢,我明白了!
zoutuo 2009-02-23
  • 打赏
  • 举报
回复
添加为什么不用session.save()方法?你执行这个程序的类名叫什么?
xxthk 2009-02-23
  • 打赏
  • 举报
回复
因为list中得到不是Person对象,list中的每一个元素都是Object数组
所以会有类型转换异常的错误


List list = session.createSQLQuery("select * from person").list();
for (Iterator iter = list.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
huangweihww 2009-02-23
  • 打赏
  • 举报
回复

List<Person> list = session.createSQLQuery("select pr.* from person pr").addEntity("pr", Person.class).list();

for(Person p : list){
System.out.println(p.getName());
}


这样 就可以了
wangzhihao_2006 2009-02-23
  • 打赏
  • 举报
回复
回答的好!
但是用HQL查询的时候为什么可以呢??可以直接用加强for循环访问
list = session.createSQLQuery("select * from person").list();
for(Person p : list){
System.out.println(p.getName());
}
而用SQLQuery查询则出来的则不行,只能用Iterator,搞不明白,API上没看出什么来呀,返回的都是Object[]!
AIP common:
throws HibernateExceptionReturn the query results as a List. If the query contains multiple results pre row, the results are returned in an instance of Object[].
Returns:
the result list
Throws:
HibernateException

请给再解释一下
wangzhihao_2006 2009-02-23
  • 打赏
  • 举报
回复
public static void main() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = null;
List <Person> list = new ArrayList <Person>();
try {
session = sf.openSession();
session.beginTransaction();
list = session.createSQLQuery("select * from person").list();
for(Person p : list){
System.out.println(p.getName());
}

session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
if (session.isOpen()) {
session.close();
}
HibernateUtil.close(sf);
}
}

抛出异常:(实在想不通哪里转换有问题)
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.wzh.hibernate_one2one.Person
at com.wzh.hibernate_one2one.Application.main(Application.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
00:11:56,968 WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/D:/UserLib/HibernateLib/env/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
Hibernate: select * from person
不是这个意思,对象已经持久化到DB中了,现在我就想用一下原生SQL(而不是用hql)来查询一下结果,但是总是报这个异常,
我定位了一下

list = session.createSQLQuery("select * from person").list();//执行到这是没有问题的
/**但是到遍历这个集合的时候就报那个异常了*/
for(Person p : list){
System.out.println(p.getName());
}
查了API,是继承Query接口的,但是就是没弄明白到底为什么报这个异常!大家拿到机子上试试看!就建个person表,里面有个
id,name字段就可以了,然后用这个查一下。我头蒙了

67,542

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧