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

tobey_cheng 2014-08-24 01:25:15
对象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表的数据却出不来。

请教各位高手指点一二。谢谢。
...全文
31024 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tobey_cheng 2014-08-28
  • 打赏
  • 举报
回复
找到方法了,可能是我没有说清楚,我先说下我的两个表数据如下: 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这两条数据了。 再次谢谢各位。
tobey_cheng 2014-08-28
  • 打赏
  • 举报
回复
结帖了,没找到解决办法,我还是用sql的方法去处理了。谢谢各位。
  • 打赏
  • 举报
回复
string hql = "from A left outer join fetch A.B"; 这个是正解
rmn190 2014-08-26
  • 打赏
  • 举报
回复
最好有相应的测试代码和测试数据。 现在这样只写问题,别人即便是想帮你解决,他也得从头开始搞整个验证环境。
丶浅 2014-08-25
  • 打赏
  • 举报
回复
HQL语句:"select a,b from a left join b where b.flag='1'"; 试试
  • 打赏
  • 举报
回复
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 ; } }); } 其实都差不多的
  • 打赏
  • 举报
回复
引用 8 楼 holzkoepfer 的回复:
用Hibernate不需要使用左联接。 直接使用 From A就可以了。需要调用B的时候 直接用 A。B就可以了
恩,楼上说的有理...
holzkoepfer 2014-08-25
  • 打赏
  • 举报
回复
用Hibernate不需要使用左联接。 直接使用 From A就可以了。需要调用B的时候 直接用 A。B就可以了
w_l_o_v_e_c 2014-08-25
  • 打赏
  • 举报
回复
补充一句,如果你特别想这么做,刚刚给你的那篇文章了也有具体的做法,好好珍藏吧!类似于迫切左外连接 :"from Customer c left join fetch c.orders o where c.name like 't%'"+" o.name like 't%'"
w_l_o_v_e_c 2014-08-25
  • 打赏
  • 举报
回复
你是说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
tobey_cheng 2014-08-25
  • 打赏
  • 举报
回复
这些答案跟我写的效果是一样的,求高手解答
  • 打赏
  • 举报
回复
from A left join A on A.bid=B.id where b.flag='1'
scott_129 2014-08-24
  • 打赏
  • 举报
回复
好像hibernate也是执行sql语句啊。 左连接使用join时,好像是with吧,你把with加上,然后把之前sql里面on的后半部分加上。试试看。
tobey_cheng 2014-08-24
  • 打赏
  • 举报
回复
自己顶一下。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧