学习hibernate时间不长,为一个比赛做项目时,遇到五张表的关联查询。
假定5张表分别为A,B,C,D,E。A关联B,C,D,C关联E。关系均为多对一。
现在需要从A中 根据B的ID值 去查询C,D,E中的部分字段以及A中的部分字段。当然,如果用hibernate不计后果的查询,很简单,QBC一句代码就完成了。但是那样关联出来的数据是可怕的。需要的只是部分字段值。
首先,我想到了sql查询,用了select a.id,c.name,d.mobile,e.name from A as a,C as b,D as d,E as e where bid=1 and sta=0;结果查询出了循环的记录,一百多条。我才疏学浅,没想出来原因,后又一步步尝试,经过翻书补了下连接查询的知识,才知道我想要每个表中的部分字段,需要外连接而不是内连接,并且是左外连接。
最终,得到的sql语句为
SELECT s.id, p.productSummarize, b.address, b.mobile, u.id, u.username, s.number, s.price, s.time FROM "
+ " shoppinglist as s left outer join productinfo as p on s.pid=p.id "
+ "left outer join buy_address as b on s.bid=b.id "
+ "left outer join buy_users as u on b.bid=u.id "
+ "WHERE s.sid=1 AND s.status=0";
本质上就是left outer join 加上on子句查询,大功告成了,用sql可以很灵活的获得需要的数据,但是后面的封装数据到bean中时真是麻烦。所以有研究了下用hql查询的写法,
结果hql语句为
select new Shoppinglist(s.id,p.productSummarize,u.username,b.address,b.mobile,s.number,s.price,s.time) from Shoppinglist as "
+ "s left join s.productinfo as p left join s.buyAddress as b left join b.buyUsers as u "
+ "where s.sellUsers.id=? and s.status=0";
但是这样需要在bean中添加响应构造函数,把没有的属性添加进去,并且加上setter,getter方法。
简化了很多数据也不需要手动封装了,直接就好了,在这次之前,我感觉hibernate很重,关联查询很方便但也效率很差,每次能查出很多很多不需要的数据,直到这次,才发现hibernate也很灵活,简单的配置下就可以省下很多事。
虽然很多地方还不能灵活运用,但是每天进步一点还是很开心,每次问题困惑时间越长,越是兴奋,因为到了增长知识的时候了。哈哈。为自己的成长做个记录。