比如有两个实体,Person和Food
Person有Long id,String sex和Set<Food> foods三个属性
Food有Long id,Date date和Person属性,其中的date记录吃食物的时间
现在我要查询性别为男的(sex为男)Person的一个List,要求Food的时间为本月
我的hql为select e from Person e left outer join e.foods p with p.planDate between ? and ? where e.sex=?
这个语句查出来的是food在当月的Person,而我的需求是查出来所有的Person,既即使这个Person本月没有food也要列出来请问应该如何实现

解决方案 »

  1.   

    我写的那个hql不符合需求,因为一旦某个Person本月food为null,这个Person就不会被查出来
    也就是说,with后面的过滤条件是在连接查询之后才过滤,我需要的是先对Food进行过滤然后和Person连接
    请问应该怎么办到
      

  2.   

    实在搞不定就用session.createSQL(String 原始的sql语句)
      

  3.   

    先把当月的food 查出来作为一个虚表,再用person去left jion.
      

  4.   

    select * from person left jion food on person.id=food.personId where food.pdate between ? and ? and person.sex=?
      

  5.   

    from Person e left outer join (from Food etp where etp.date between ? and ?) ep where e.sex=?
    我这么写了之后就会报错unexpected token,是括号里的子查询不能识别,那么正确的写法应该是什么样的呢
      

  6.   

    你这种写法hibernate不识别的,在on的地方就报不识别了
      

  7.   


    hql我没有写过几个,不过 你这里 left outer join (from Food etp where etp.date between ? and ?)  好像没有给出连接条件。
      

  8.   


    from Person e left outer join Food etp with etp.date between ? and ? where e.sex=?
      

  9.   

    我上面写的有问题。可能需要直接用SQL才行。用hql可能有问题。
      

  10.   

    我最开始就是用你这种方法写的,,,这种写法把没有food的person过滤掉了,,所以不行
      

  11.   

    由于用的是Oracle,所以如果写原生sql的话需要to_date函数,因此不可以的
      

  12.   


    你就不可以查询出来结果之后,在将food的person过滤掉不就可以了吗?
      

  13.   

    没懂您的意思。。我现在要过滤的是person里的food,而person不过滤,要全部拿来
      

  14.   

    你配置的是 food 到person 的外键关联,(from Food etp where etp.date between ? and ?) 是作为一张虚表,并没有关联到。另外,个人不是很推荐HQL,也是要淘汰掉的东西,LZ可以去学习一下 hibernate 3的条件查询标准:criteria.
      

  15.   

    sql语句自己去拼接,去判断
    比如
    StringBuffer sql=new StringBuffer("select * from Person as p,Food as f where p.id=fid and 1=1 ");
    if(date!=null){
        sql.buffer(" and f.date between xxx and xxx ");
    }
    if(sex!=null){
        sql.buffer(" and p.sex=xxx")
    }session.createSQL(sql).addEntity(Person.class);
      

  16.   

    通过过滤器能查出来了,但是还有问题!!!
    比如一共有10个person,其中一个person有两个food,那么查出的list<person>居然会有十一条。。
    也就是说有两条一模一样的person的被查出来,这应该怎么解决啊