hibernate连接查询的过滤问题

zygsee 2010-06-17 02:25:26
比如有两个实体,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也要列出来

请问应该如何实现
...全文
269 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zygsee 2010-06-20
  • 打赏
  • 举报
回复
依然没解决。。。
longtenggdf 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 longtenggdf 的回复:]
引用 9 楼 zygsee 的回复:
引用 7 楼 longtenggdf 的回复:
先把当月的food 查出来作为一个虚表,再用person去left jion.

from Person e left outer join (from Food etp where etp.date between ? and ?) ep where e.sex=?
我这么写了之后就会报错unexpe……
[/Quote]
你配置的是 food 到person 的外键关联,(from Food etp where etp.date between ? and ?) 是作为一张虚表,并没有关联到。另外,个人不是很推荐HQL,也是要淘汰掉的东西,LZ可以去学习一下 hibernate 3的条件查询标准:criteria.
zygsee 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 qiheia 的回复:]
引用 16 楼 zygsee 的回复:
引用 14 楼 sgcl 的回复:
SQL code

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

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


你就不可以查询出来结果……
[/Quote]
没懂您的意思。。我现在要过滤的是person里的food,而person不过滤,要全部拿来
zygsee 2010-06-18
  • 打赏
  • 举报
回复
通过过滤器能查出来了,但是还有问题!!!
比如一共有10个person,其中一个person有两个food,那么查出的list<person>居然会有十一条。。
也就是说有两条一模一样的person的被查出来,这应该怎么解决啊
qiheia 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zygsee 的回复:]
引用 14 楼 sgcl 的回复:
SQL code

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

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

你就不可以查询出来结果之后,在将food的person过滤掉不就可以了吗?
  • 打赏
  • 举报
回复
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);

zygsee 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 focusforce 的回复:]
引用 5 楼 focusforce 的回复:
实在搞不定就用session.createSQL(String 原始的sql语句)

是createSQLQuery
[/Quote]由于用的是Oracle,所以如果写原生sql的话需要to_date函数,因此不可以的。。。
zygsee 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sgcl 的回复:]
SQL code

from Person e left outer join Food etp with etp.date between ? and ? where e.sex=?
[/Quote]
我最开始就是用你这种方法写的,,,这种写法把没有food的person过滤掉了,,所以不行
平淡面对 2010-06-17
  • 打赏
  • 举报
回复
我上面写的有问题。可能需要直接用SQL才行。用hql可能有问题。
平淡面对 2010-06-17
  • 打赏
  • 举报
回复

from Person e left outer join Food etp with etp.date between ? and ? where e.sex=?
zygsee 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 longtenggdf 的回复:]
引用 9 楼 zygsee 的回复:
引用 7 楼 longtenggdf 的回复:
先把当月的food 查出来作为一个虚表,再用person去left jion.

from Person e left outer join (from Food etp where etp.date between ? and ?) ep where e.sex=?
我这么写了之后就会报错unexpe……
[/Quote]在映射文件里已经配置了外键关联,,,
yangxuan18 2010-06-17
  • 打赏
  • 举报
回复
同楼上
longtenggdf 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zygsee 的回复:]
引用 7 楼 longtenggdf 的回复:
先把当月的food 查出来作为一个虚表,再用person去left jion.

from Person e left outer join (from Food etp where etp.date between ? and ?) ep where e.sex=?
我这么写了之后就会报错unexpected token,是括号里的子查询不……
[/Quote]

hql我没有写过几个,不过 你这里 left outer join (from Food etp where etp.date between ? and ?) 好像没有给出连接条件。
zygsee 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tracyxiaoai 的回复:]
select * from person left jion food on person.id=food.personId where food.pdate between ? and ? and person.sex=?
[/Quote]你这种写法hibernate不识别的,在on的地方就报不识别了
zygsee 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 longtenggdf 的回复:]
先把当月的food 查出来作为一个虚表,再用person去left jion.
[/Quote]
from Person e left outer join (from Food etp where etp.date between ? and ?) ep where e.sex=?
我这么写了之后就会报错unexpected token,是括号里的子查询不能识别,那么正确的写法应该是什么样的呢
tracyXiaoAi 2010-06-17
  • 打赏
  • 举报
回复
select * from person left jion food on person.id=food.personId where food.pdate between ? and ? and person.sex=?
longtenggdf 2010-06-17
  • 打赏
  • 举报
回复
先把当月的food 查出来作为一个虚表,再用person去left jion.
focusforce 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 focusforce 的回复:]
实在搞不定就用session.createSQL(String 原始的sql语句)
[/Quote]
是createSQLQuery
focusforce 2010-06-17
  • 打赏
  • 举报
回复
实在搞不定就用session.createSQL(String 原始的sql语句)
dr_lou 2010-06-17
  • 打赏
  • 举报
回复
left join ?
加载更多回复(3)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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