hibernate将sql或hql查询结果集映射为实体类 不需要映射文件

假设我们现在有一个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语句中属性的位置要与构造方法中的位置一一对应。

遇到问题:

hibernate原生sql封装,报错信息:could not find setter for ...

在mysql环境下,以下代码,在mysql下运行正常,但是切换到oralce,报出找不到USERNAME属性的错误。

分析:原来是oracle自动将列映射的userName转换为大写的USERNAME,所以不能映射,报类找不到USERNAME的set方法。

解决办法:添加addScalar方法,代码如下:

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).addScalar("userName").addScalar("title").addScalar("addTime").setResultTransformer(Transformers.aliasToBean(PostVO.class));  

还有一种方式解决,就是使用双引号将别名包裹起来,感觉不是很优雅。像这样

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));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值