hibernate纯sql查询结果集映射为DTO(VO,DO)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > hibernate纯sql查询结果集映射为DTO(VO,DO)

hibernate纯sql查询结果集映射为DTO(VO,DO)

 2011/11/21 7:54:49  peijunlin2008  http://peijunlin2008.iteye.com  我要评论(0)
  • 摘要:感谢glamey,paddy.w两位兄弟的文章。原文链接如下:http://paddy-w.iteye.com/blog/888830假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句查询得到的内容转为一个DTO对象,其解决方法如下:Stringsql="selectu.userNameasuserName,p.titleastitle,p.addTimeasaddTimefromuserasu,postaspwhereu.id=p
  • 标签: 结果 SQL hibernate
感谢glamey,paddy.w 两位兄弟的文章。原文链接如下: http://paddy-w.iteye.com/blog/888830

        假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句查询得到的内容转为一个DTO对象,其解决方法如下:

String sql = "select u.userName as userName ,p.title as title ,p.addTime as addTime from user as u,post as p where u.id=p.userId"    
Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));
 

        上面select中as后面的内容必须和PostVO中属性名一致,这样就可以返回一个针对PostVO的一个集合。
        其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。
        如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成:
 
setResultTransformer(new VOResultTransformer(PostVO.class));  



另外,除了以上glamey的方法外,还有一种方法:

Query q = session.createQuery("select new com.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m");  
List<MsgInfo> list=q.list();  


其中,MsgInfo是DTO。值得注意的是,第二种方法中DTO必须提供带参数的构造方法,并且HQL语句中属性的位置要与构造方法中的位置一一对应。
发表评论
用户名: 匿名