hibernate用HQL查询集合属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate用HQL查询集合属性相关的知识,希望对你有一定的参考价值。
Hibernate查询时遇到要获取一整个集合关联属性时怎么用HQL和Query类查询?如果不行应该怎么做?假如需要返回下图中content的List怎么写?
参考技术A hql="selects.id,s.name,t.id,t.namefromUsers,Useraddresstwheret.id=s.id"这条sql里面的User和Useraddress是两个实体类,现在组合查询分别取出来两个实体类里面的两个字段,然后我想再建立一个实体类Result,里面定义这四个结果集里面的字段,能不能执行完这条hql,正好把这个结果集对应到实体类Result里面呢,Result这个实体类,没写映射文件Result.hbm.xml.希望能帮下忙2种做法创建一个classtemp有属性sid,name,tid,sname,tname创建一个构造函数publictemp(sid,name,tid,sname,tname)1.hql中Listselectnewtemp(s.id,s.name,t.id,t.name)fromUsers,Useraddresstwheret.id=s.id2.List记录的每一行是object[]遍历object[0]==s.idobject[1]==s.nameobject[2]==t.idobject[3]==t.name感谢glamey兄弟的文章,正好解决了当前遇到的问题。原文链接如下:/blog/721019假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句查询得到的内容转为一个DTO对象,其解决方法如下:Stringsql="selectu.userNameasuserName,p.titleastitle,p.addTimeasaddTimefromuserasu,postaspwhereu.id=p.userId"Queryq=factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));上面select中as后面的内容必须和PostVO中属性名一致,这样就可以返回一个针对PostVO的一个集合。其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成:setResultTransformer(newVOResultTransformer(PostVO.class));另外,除了以上glamey的方法外,还有一种方法:Queryq=session.createQuery("selectnewcom.hibernate.MsgInfo(m.id,m.cont,m.topic.title,m.topic.category.name)fromMsgm");Listlist=q.list();其中,MsgInfo是DTO。值得注意的是,第二种方法中DTO必须提供带参数的构造方法,并且HQL语句中属性的位置要与构造方法中的位置一一对应。以上是关于hibernate用HQL查询集合属性的主要内容,如果未能解决你的问题,请参考以下文章