论坛首页 Java版 Hibernate

HQL的返回值该怎么取得?

浏览 14309 次
该帖已经被评为精华帖
作者 正文
时间:2003-09-16
很多人搞不清楚怎么取得HQL的返回值,下面举例说明:

取单个字段,会返回字段List:

[code:1]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());
}[/code:1]

取多个字段,Hibernate把每个id和name做成一个2个元素的单维数组,List实际上是一个单维数组的集合。

[code:1]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];
}[/code:1]

在这种情况下,HQL是不会去构造PO的,这一点很容易验证。JCS是对象Cache,如果写了这样的HQL,JCS里面是空的,说明Hibernate没有构造PO,如果再加上一个对象c本身,JCS里面就有数据了,如下:

[code:1]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];
}[/code:1]
   
时间: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显示?
   
0 请登录后投票
时间: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对象。不知道我理解的对不对.
   
0 请登录后投票
时间:2004-09-08
mudeen 的回答比较“0”。

因为我主要想执行取得的stlist 可以在Jsp中用Struts标签显示成功,
所以你没有理解我的真正意思,那查询结果肯定是些“Object[i]”,关键是结果怎样用Struts 标签来<logic:iterate 显示;

最后我的解决方法是重新在原来Student ——formbean里面加了Teacher 中查询出来要显示的属性,在
[code:1]

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;[/code:1]




执行取得的stlist 可以在Jsp中用Struts标签显示就会成功:
[code:1]<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> [/code:1]


其实如果你的Struts原理清楚,这些都不是问题!
   
0 请登录后投票
时间:2004-09-09
在这种情况下,HQL是不会去构造PO的,这一点很容易验证。JCS是对象Cache,如果写了这样的HQL,JCS里面是空的,说明Hibernate没有构造PO,如果再加上一个对象c本身,JCS里面就有数据了,如下:
引用

[code:1]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];
}[/code:1]




为什么我运行这个的时候会出错误: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();
}
}
   
0 请登录后投票
时间: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

仔细看看楼主的帖子
   
0 请登录后投票
时间:2004-09-10
晕啊,这么不认真,给大家添麻烦了.
   
0 请登录后投票
时间:2004-09-20
JDBC的ResultSet有足够的元数据, 支持rs.getString(fieldName)这样的操作,
HQL这样单单返回一个Object[], 不带任何元信息, 很不方便所有框架的自动化类阿.

还有一个可选的方法, 专门定义一个新类,用
select new TrackSummary(track.id, track.title)

代替

select track.id, track.title
   
0 请登录后投票
时间: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参考吧
   
0 请登录后投票
时间:2004-09-28
在hibernate中使用hql会有一个问题
使用hql是没有办法是用配置文件中的out join的
fetch join 需要自己手工写的,写出来的代码觉得和jdbc写出来的差不多的
不过可以写出最优化的查询语句
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐