当前位置: 代码迷 >> J2EE >> 求教hql的left join组合条件的写法
  详细解决方案

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

热度:96   发布时间:2016-04-17 23:44:35.0
求教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表的数据却出不来。

请教各位高手指点一二。谢谢。
------解决方案--------------------
好像hibernate也是执行sql语句啊。
左连接使用join时,好像是with吧,你把with加上,然后把之前sql里面on的后半部分加上。试试看。
------解决方案--------------------
HQL语句:"select a,b from  a left  join b where b.flag='1'";
试试
------解决方案--------------------
from A left join A on A.bid=B.id where b.flag='1'
------解决方案--------------------
你是说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
------解决方案--------------------
补充一句,如果你特别想这么做,刚刚给你的那篇文章了也有具体的做法,好好珍藏吧!类似于迫切左外连接 :"from Customer c left join fetch c.orders o where c.name like 't%'"+" o.name like 't%'"

------解决方案--------------------
用Hibernate不需要使用左联接。
直接使用 From A就可以了。需要调用B的时候 直接用 A。B就可以了
------解决方案--------------------
引用:
用Hibernate不需要使用左联接。
直接使用 From A就可以了。需要调用B的时候 直接用 A。B就可以了


恩,楼上说的有理...
------解决方案--------------------
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 HibernateExceptionSQLException {  
   Query query = s.createSQLQuery(sql.toString());//执行普通sql  
List list = query.list();  
return list ;  
                    }  
                });
}
其实都差不多的
------解决方案--------------------
最好有相应的测试代码和测试数据。 现在这样只写问题,别人即便是想帮你解决,他也得从头开始搞整个验证环境。 
------解决方案--------------------
string hql = "from A left outer join fetch A.B"; 这个是正解
  相关解决方案