相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个vo中而烦恼不已。我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的。
例如现在有两张表,一张是user表,放了一些用户的信息,另外一张表是用户发表的帖子,里边有一个user的外键。我们需要查询出来,某个人发布的帖子,sql如下:
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,代码如下:
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中更改成
setresulttransformer(new voresulttransformer(postvo.class));
原帖地址:http://glamey.iteye.com/blog/721019