java hql left join_求教hql的left join结合条件的写法

对象A 对应 表A,

对象B 对应 表B,

其中对象A中设置属性@ManyToOne 关联了对象B

但并不是所有A表数据都必然对应一个B表数据,即A表数据>=B表数据

现在想统计如下sql写法的数据:

string sql = “select a.*,b.name from a left join b on a.bid=b.id and b.flag=””1″””;

我现在需要转化成hql的写法,如下:

string hql = “from A left join A.B where b.flag=””1″””;

结果出来的数据是A表中关联了B表的数据,而A表中没关联B表的数据却出不来。

请教各位高手指点一二。谢谢。

b829963380d658234a82a0737201a59c.png

自己顶一下。

7c8003838ad3b03b1cc736f534a35664.png

10分

好像hibernate也是执行sql语句啊。

左连接使用join时,好像是with吧,你把with加上,然后把之前sql里面on的后半部分加上。试试看。

7c8003838ad3b03b1cc736f534a35664.png

10分

HQL语句:”select a,b from  a left  join b where b.flag=””1″””;

试试

7c8003838ad3b03b1cc736f534a35664.png

10分

from A left join A on A.bid=B.id where b.flag=””1″”

b829963380d658234a82a0737201a59c.png

这些答案跟我写的效果是一样的,求高手解答

7c8003838ad3b03b1cc736f534a35664.png

10分

你是说string sql = “select a.*,b.name from a left join b on a.bid=b.id and b.flag=””1″””;这样查询正确,而换为hql  string hql = “from A left join A.B where b.flag=””1″””;却不行?

如果是这样,两种方法:1.你可以使用原生查询执行sql  2.不要使用join,hibernate不支持left   join语法,给你个文章看看,当然建议使用92语法

http://awaitdeng.iteye.com/blog/735063http://awaitdeng.iteye.com/blog/735063

7c8003838ad3b03b1cc736f534a35664.png

10分

补充一句,如果你特别想这么做,刚刚给你的那篇文章了也有具体的做法,好好珍藏吧!类似于迫切左外连接 :”from Customer c left join fetch c.orders o where c.name like “”t%”””+” o.name like “”t%”””

7c8003838ad3b03b1cc736f534a35664.png

10分

用Hibernate不需要使用左联接。

直接使用 From A就可以了。需要调用B的时候 直接用 A。B就可以了

7c8003838ad3b03b1cc736f534a35664.png

10分

引用 8 楼 holzkoepfer 的回复:

用Hibernate不需要使用左联接。

直接使用 From A就可以了。需要调用B的时候 直接用 A。B就可以了

恩,楼上说的有理…

7c8003838ad3b03b1cc736f534a35664.png

10分

public List  findDeviceInfoByAreaId(Integer areaId,Integer deviceTypeId){

final StringBuffer sql=new StringBuffer();

sql.append(“select d.deviceinfoId,d.deviceinfoName,s.devicetypeName,w.warnNotifyDeviceId,l.levelName,w.warnNotifyType,l.levelId from  device_deviceinfo  as d   “);

sql.append(” left join sys_devicetype as s on d.deviceinfoTypeId=s.devicetype  left join device_coreinfo as c on d.deviceinforCoreId=c.coreinfoId  “);

sql.append(” left join sys_warnnotify as w on   d.deviceinfoId=w.warnNotifyDeviceId  left join sys_warnlevel  as l on  w.warnNotifyLevelId=l.levelId  “);

sql.append(” where 1=1 “);

if(areaId!=null&&areaId>0){

sql.append(” and  c.coreinfoAreaId=”+areaId+””);

}

if(deviceTypeId!=null&&deviceTypeId>0){

sql.append(” and  s.devicetype=”+deviceTypeId+””);

}

return  (List) getHibernateTemplate().execute(

new HibernateCallback() {

public List doInHibernate(final Session s)

throws HibernateException, SQLException {

Query query = s.createSQLQuery(sql.toString());//执行普通sql

List list = query.list();

return list ;

}

});

}

其实都差不多的

7c8003838ad3b03b1cc736f534a35664.png

10分

最好有相应的测试代码和测试数据。 现在这样只写问题,别人即便是想帮你解决,他也得从头开始搞整个验证环境。

7c8003838ad3b03b1cc736f534a35664.png

10分

string hql = “from A left outer join fetch A.B”; 这个是正解

b829963380d658234a82a0737201a59c.png

结帖了,没找到解决办法,我还是用sql的方法去处理了。谢谢各位。

b829963380d658234a82a0737201a59c.png

找到方法了,可能是我没有说清楚,我先说下我的两个表数据如下:

A表:

id ,  name ,  bid

1      名字1

2      名字2    1

3      名字3     2

B表:

id,  name,   flag

1       张三     true

2       李四     false

我之前用的hql写法如下:

string hql = “from A left join A.B where b.flag=””true”””;

这个时候返回的结果只有A表的id=2这条数据

我现在修改如下即可实现:

string hql = “from A left join A.B where (b.flag is null or b.flag=””true””)”;

这样就实现了我返回id=1和id=2这两条数据了。

再次谢谢各位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值