resulttransformer hibernate用HQL查询集合属性
朋友们,resulttransformer和hibernate用HQL查询集合属性是当今热门话题,但是它们的内涵和影响力可能会让人感到困惑。在本篇文章中,我将为你们揭示它们的本质和重要性,希望能够为你们带来新的认识。
hibernate用HQL查询集合属性
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语句中属性的位置要与构造方法中的位置一一对应。
原生sql查询怎样返回page对象
最近由于需求变更,客户需要在原来的查询基础上加上一个判断条件,但是这个判断条件所在的实体跟原来的查询实体没有直接关联。为了不影响原来的查询结果,改为用原生SQL,使用left join来关联查询。为了不改变对查询结果的处理逻辑,将查询结果封装成原来的对象进行操作。具体操作方法如下:
1.基于JPA规范的程序:
Query query= entityManager.createNativeQuery("select id, name, age from t_user");
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(clazz));
//其中clazz为封装对象的class
List rows= query.getResultList();
2.基于Session的程序:
sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS").setResultTransformer(Transformers.aliasToBean(clazz));
这两种方法需要注意的是查询的字段的别名需要跟clazz的属性对应。
OK,本文到此结束,希望对大家有所帮助。