日期:2014-05-18  浏览次数:20632 次

Hibernate左连接查询!!!


 现在我想查出某一天用户的打卡情况,也就是所有的用户都查出来外加SignDate表的打卡日期signdate字段,当天有打卡的用户signdate字段就有值,没打卡的话为null,想用左连接的方式查,可结果出来只有当天有打卡的用户,没打卡的用户查不出来。

我是这样写的:
select u.userName,u.name,sr.signDate from User u left join u.signRecord sr where sr.signDate>=? 
and sr.signDate<=?



这样怎么解决呢? 还是说有其他解决办法
------解决方案--------------------
你的where用的不对,如果这种写,那没打卡的不就直接被过滤掉了么
这种就只会留下打卡在日期查询范围内的数据

这个是hql吧,我记得你应该用fetch(是不是这个我忘记了,就是相当于sql中on的那个) sr.signDate>=? 
and sr.signDate<=? 而不是where

------解决方案--------------------
楼主你的筛选条件已经要求打卡时间了,你没有打卡时间的用户自然是得不到的.
你可以这样在这个基础上再查下没有打卡记录的用户信息union上去
select u.userName,u.name,sr.signDate from User u left join u.signRecord sr where sr.signDate>=? and sr.signDate<=?
union
select u.userName,u.name,null from User u where id not in(
select u.id from User u left join u.signRecord sr where sr.signDate>=? and sr.signDate<=?)
------解决方案--------------------
下面是sql的形式 ,两种应该都是可以的,仅作示意
第一种
select a.id, b.signdate, a.name
  from t_user a
  left join t_signrecord b
    on a.id = b.tid
   and to_char(signdate, 'yyyy-MM-dd') > '2014-03-11'

第二种
select a.id, b.signdate, a.name
  from t_user a
  left join (select id,signdate,tid from t_signrecord where to_char(signdate, 'yyyy-MM-dd') > '2014-03-11') b
    on a.id = b.tid
------解决方案--------------------
如果楼主能不用hql的话改用sql,就简单了
select u.userName,u.name,sr.signDate from User u left join u.signRecord sr on u.id=sr.uid and sr.signDate>=? and sr.signDate<=?