hibernate多表查询指定字段(两张表以上)

在使用Hibernate进行项目开发时,遇到了需要从多张表(A, B, C, D, E)中根据特定条件查询部分字段的问题。通过学习和实践,了解到内连接导致循环记录,采用左外连接配合ON子句解决了这一问题。最终,用SQL和HQL分别实现了查询,SQL通过LEFT OUTER JOIN实现,HQL则利用构造函数简化了数据封装。这次经验展示了Hibernate在灵活性和效率上的提升。" 124144514,10653084,在Gazebo中添加动态障碍物的教程,"['自动驾驶', 'ROS', '路径规划', '模拟环境', 'Gazebo插件']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习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也很灵活,简单的配置下就可以省下很多事。

虽然很多地方还不能灵活运用,但是每天进步一点还是很开心,每次问题困惑时间越长,越是兴奋,因为到了增长知识的时候了。哈哈。为自己的成长做个记录。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值