论坛首页 Java企业应用论坛

HQL的返回值该怎么取得?

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

取单个字段,会返回字段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];  
}
   发表时间: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标签显示成功:
&lt;logic:iterate id="stu" name="stlist" &gt; 
&lt;tr bgcolor="#ffffff"&gt;
            &lt;td align="center"&gt;&lt;bean:write name="stu" property="name"/&gt;&lt;/td&gt;           
        &lt;/tr&gt;
&lt;/logic:iterate&gt;


但现在我要同时从两个表中去数据:
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标签显示失败:
&lt;logic:iterate id="stu" name="stlist" &gt; 
&lt;tr bgcolor="#ffffff"&gt;
            &lt;td align="center"&gt;&lt;bean:write name="stu" property="name"/&gt;&lt;/td&gt;          
&lt;td align="center"&gt;&lt;bean:write name="stu" property="tname"/&gt;&lt;/td&gt;            
        &lt;/tr&gt;
&lt;/logic:iterate&gt;


这时会出现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标签显示成功:
&lt;logic:iterate id="stu" name="stlist" &gt; 
&lt;tr bgcolor="#ffffff"&gt;
            &lt;td align="center"&gt;&lt;bean:write name="stu" property="name"/&gt;&lt;/td&gt;           
        &lt;/tr&gt;
&lt;/logic:iterate&gt;


但现在我要同时从两个表中去数据:
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标签显示失败:
&lt;logic:iterate id="stu" name="stlist" &gt; 
&lt;tr bgcolor="#ffffff"&gt;
            &lt;td align="center"&gt;&lt;bean:write name="stu" property="name"/&gt;&lt;/td&gt;          
&lt;td align="center"&gt;&lt;bean:write name="stu" property="tname"/&gt;&lt;/td&gt;            
        &lt;/tr&gt;
&lt;/logic:iterate&gt;


这时会出现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 中查询出来要显示的属性,在

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原理清楚,这些都不是问题!
0 请登录后投票
   发表时间: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();
  }
}
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企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics