关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)
2016-01-20 16:42
302 查看
相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个VO中而烦恼不已。我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的。
例如现在有两张表,一张是user表,放了一些用户的信息,另外一张表是用户发表的帖子,里边有一个user的外键。我们需要查询出来,某个人发布的帖子,sql如下:
Java代码
但是我们的POJO映射仅仅是做了user,post表的映射,这个时候,我们需要写一个PostVO类,里边放着了用户的信息和帖子的信息的属性,设置get\set方法,务必保证这个类里边有一个默认的构造函数。
然后我们开始写这个数据库操作的dao,代码如下:
Java代码
红字部分必须跟PostVO中的属性一直,这样就可以返回一个针对PostVO的一个集合。
其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。
如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成
Java代码
即可。
原文链接如下:/article/3880829.html
例如现在有两张表,一张是user表,放了一些用户的信息,另外一张表是用户发表的帖子,里边有一个user的外键。我们需要查询出来,某个人发布的帖子,sql如下:
Java代码
select u.userName,p.title,p.addTime from user as u,post as p where u.id=p.userId
但是我们的POJO映射仅仅是做了user,post表的映射,这个时候,我们需要写一个PostVO类,里边放着了用户的信息和帖子的信息的属性,设置get\set方法,务必保证这个类里边有一个默认的构造函数。
然后我们开始写这个数据库操作的dao,代码如下:
Java代码
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));
红字部分必须跟PostVO中的属性一直,这样就可以返回一个针对PostVO的一个集合。
其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。
如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成
Java代码
setResultTransformer(new VOResultTransformer(PostVO.class));
即可。
原文链接如下:/article/3880829.html
相关文章推荐
- Oracle数据库基础知识
- MySql的基本架构演变
- mybatis的分页操作
- MYSQL正则表达式
- hive1.1.0安装与配置(远程mysql)
- MySQL5.6 实现主从复制,读写分离,分散单台服务器压力
- 修改mysql最大连接次数问题,默认为100次
- 数据库事务的隔离级别
- Mysql连接不上数据库问题
- linux服务器查看redis版本:
- MySQL数据库多实例主从同步
- MySQL主键的理解
- oracle中如何将字符和数字转成中文
- oracle查看数据库版本和字符集
- mysql数据转到oracle数据库
- mysql explain 详解
- Linux centos6.7 安装oracle
- 一些用到的SQL语句
- Mongodb Profiler Output
- SQL检测开始日期 结束日期 是否存在交叉