锁定老帖子 主题:HQL的返回值该怎么取得?
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-09-16
取单个字段,会返回字段List: Query q = s.createQuery("select c.id from Cat as c");; List l = q.list();; for (i=0; i< l.size();; i++); { Long id = (Long); l.get(i);; System.out.println(id.longValue(););; } 取多个字段,Hibernate把每个id和name做成一个2个元素的单维数组,List实际上是一个单维数组的集合。 Query q = s.createQuery("select Cat.id, Cat.name, from Cat ");; List l = q.list();; for (int i=0; i< l.size();; i++); { Object[] row = (Object[]); l.get(i);; Long id = (Long); row[0]; String name = (String); row[1]; } 在这种情况下,HQL是不会去构造PO的,这一点很容易验证。JCS是对象Cache,如果写了这样的HQL,JCS里面是空的,说明Hibernate没有构造PO,如果再加上一个对象c本身,JCS里面就有数据了,如下: Query q = s.createQuery("select c.id, c.name,c from Cat as c");; List l = q.list();; for (int i=0; i< l.size();; ; i++); { Object[] row = (Object[]); l.get(i);; Long id = (Long); row[0]; String name = (String); row[1]; Cat c = (Cat); row[2]; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-08-23
我用
String hsql="select student.name from Student student "; query=session.createQuery(hsql); stlist = query.list(); session.close(); return stlist; 执行取得的stlist 可以在Jsp中用Struts标签显示成功: <logic:iterate id="stu" name="stlist" > <tr bgcolor="#ffffff"> <td align="center"><bean:write name="stu" property="name"/></td> </tr> </logic:iterate> 但现在我要同时从两个表中去数据: String hsql="select student.name ,teacher.tname from Student student , Teacher teacher "; query=session.createQuery(hsql); stlist = query.list(); session.close(); return stlist; 执行取得的stlist 可以在Jsp中用Struts标签显示失败: <logic:iterate id="stu" name="stlist" > <tr bgcolor="#ffffff"> <td align="center"><bean:write name="stu" property="name"/></td> <td align="center"><bean:write name="stu" property="tname"/></td> </tr> </logic:iterate> 这时会出现jsp页面出现: No getter method for property name of bean stu 的提示?? 请问如何从两个表取得的数据在Jsp中用Struts标签logic:iterate显示? |
|
返回顶楼 | |
发表时间:2004-08-25
mgjava 写道 我用
String hsql="select student.name from Student student "; query=session.createQuery(hsql); stlist = query.list(); session.close(); return stlist; 执行取得的stlist 可以在Jsp中用Struts标签显示成功: <logic:iterate id="stu" name="stlist" > <tr bgcolor="#ffffff"> <td align="center"><bean:write name="stu" property="name"/></td> </tr> </logic:iterate> 但现在我要同时从两个表中去数据: String hsql="select student.name ,teacher.tname from Student student , Teacher teacher "; query=session.createQuery(hsql); stlist = query.list(); session.close(); return stlist; 执行取得的stlist 可以在Jsp中用Struts标签显示失败: <logic:iterate id="stu" name="stlist" > <tr bgcolor="#ffffff"> <td align="center"><bean:write name="stu" property="name"/></td> <td align="center"><bean:write name="stu" property="tname"/></td> </tr> </logic:iterate> 这时会出现jsp页面出现: No getter method for property name of bean stu 的提示?? 请问如何从两个表取得的数据在Jsp中用Struts标签logic:iterate显示? 我觉得顶楼的已经说得很明白了.因为你在取得tudent.name ,teacher.tname 的时候获得的只是一个二维数组。里面并没有student和teacher对象。不知道我理解的对不对. |
|
返回顶楼 | |
发表时间:2004-09-08
mudeen 的回答比较“0”。
因为我主要想执行取得的stlist 可以在Jsp中用Struts标签显示成功, 所以你没有理解我的真正意思,那查询结果肯定是些“Object[i]”,关键是结果怎样用Struts 标签来<logic:iterate 显示; 最后我的解决方法是重新在原来Student ——formbean里面加了Teacher 中查询出来要显示的属性,在 List mylist=new ArrayList();; List l = q.list();; for (int i=0; i< l.size();; i++); { Object[] row = (Object[]); l.get(i);; sutFormBean.setXXX(row);; mylist.add(sutFormBean);; ...} return mylist; 执行取得的stlist 可以在Jsp中用Struts标签显示就会成功: <logic:iterate id="stu" name="mylist" > <tr bgcolor="#ffffff"> <td align="center"><bean:write name="stu" property="name"/></td> <td align="center"><bean:write name="stu" property="tname"/></td> </tr> </logic:iterate> 其实如果你的Struts原理清楚,这些都不是问题! |
|
返回顶楼 | |
发表时间:2004-09-09
在这种情况下,HQL是不会去构造PO的,这一点很容易验证。JCS是对象Cache,如果写了这样的HQL,JCS里面是空的,说明Hibernate没有构造PO,如果再加上一个对象c本身,JCS里面就有数据了,如下:
引用 Query q = s.createQuery("select c.id, c.name,c from Cat as c");; List l = q.list();; for (int i=0; i< l.size();; ; i++); { Object[] row = (Object[]); l.get(i);; Long id = (Long); row[0]; String name = (String); row[1]; Cat c = (Cat); row[2]; } 为什么我运行这个的时候会出错误:java.lang.ArrayIndexOutOfBoundsException: 2 at com.hibernate_test.Test_Login6.main(Test_Login6.java:32) Exception in thread "main" 我的代码: public class Test_Login6 { public static void main(String[] args)throws Exception { Configuration cfg = new Configuration() .addClass(Login.class); SessionFactory sessionFactory = cfg.buildSessionFactory(); Session session = sessionFactory.openSession(); Query sql = session.createQuery("select G.id,G.username from com.hibernate_test.Login as G order by G.id"); List list = sql.list(); for (int i=0; i< list.size(); i++) { Object[] row = (Object[]) list.get(i); Long id = (Long) row[0]; String name = (String) row[1]; Login login = (Login) row[2]; System.out.println(id); System.out.println(name); } session.close(); } } |
|
返回顶楼 | |
发表时间:2004-09-09
楼上
select G.id,G.username from com.hibernate_test.Login as G order by G.id 改成 select G.id,G.username,G from com.hibernate_test.Login as G order by G.id 仔细看看楼主的帖子 |
|
返回顶楼 | |
发表时间:2004-09-10
晕啊, 这么不认真,给大家添麻烦了.
|
|
返回顶楼 | |
发表时间:2004-09-20
JDBC的ResultSet有足够的元数据, 支持rs.getString(fieldName)这样的操作,
HQL这样单单返回一个Object[], 不带任何元信息, 很不方便所有框架的自动化类阿. 还有一个可选的方法, 专门定义一个新类,用 select new TrackSummary(track.id, track.title) 代替 select track.id, track.title |
|
返回顶楼 | |
发表时间:2004-09-27
感谢robbin的帖子
嗯 用Object[]取得结果集以前用过很多次 List l=forumDBSearcher.getSess().createQuery("select ft.id from ForumThread ").list(); nextThreadId = ((Long) l.get(0)).longValue(); 当刚刚调了上面的语句总是用Object[]+row[0]的方法总是出null错 后来发现采用直接取l.get(0)就OK了 是不是当返回只有一个字段时 Hibernate采用Object来代替Object[]呢 想想这也是应该的吧 只是以前没有注意到 项目紧张来不及看source了 先帖出来供我这样的newbie参考吧 |
|
返回顶楼 | |
发表时间:2004-09-28
在hibernate中使用hql会有一个问题
使用hql是没有办法是用配置文件中的out join的 fetch join 需要自己手工写的,写出来的代码觉得和jdbc写出来的差不多的 不过可以写出最优化的查询语句 |
|
返回顶楼 | |