数据表:
comment{ id, user_id, parent_id } // parent_id指被评论的comment的idhibernate对象映射(简化版):
Comment{ Long id, Long user_id, Comment parent }数据库数据(示意版):
comment表:
id user_id parent_id
1 1 null
2 2 1
也就是说,user 1发表了一篇评论,user 2评论了user 1的评论目标:查找user 1发出和收到的评论(本来理论上应该为2,但是):HQL语句:
1.查找收到的评论:
select count(*) from Comment where parent.user_id=1;
结果是12.查到发出的评论:
select count(*) from Comment where user_id=1;
结果是13.查找全部的评论:
select count(*) from Comment where parent.user_id=1 or user_id=1;
结果却仍然是1后来我查看了HQL生成的SQL语句,其中的where部分括号位置不合要求,简写如下:
... where comment0_.parent_id=comment1_.id and (comment1_.user_id=1 or comment0_.user_id=1)
他居然先入为主地先将两个表做连接了,而我的本意应该是改变一下括号的顺序:
... where (comment0_.parent_id=comment1_.id and comment1_.user_id=1) or comment0_.user_id=1
甚至都不用加括号,我觉得我的HQL语句没错,但是不知道怎么会生成这样的SQL语句,我自己又没法控制!不知道能有谁指点一下正确的HQL语句吗?(虽然我的HQL语句在逻辑上算也是正确的)
comment{ id, user_id, parent_id } // parent_id指被评论的comment的idhibernate对象映射(简化版):
Comment{ Long id, Long user_id, Comment parent }数据库数据(示意版):
comment表:
id user_id parent_id
1 1 null
2 2 1
也就是说,user 1发表了一篇评论,user 2评论了user 1的评论目标:查找user 1发出和收到的评论(本来理论上应该为2,但是):HQL语句:
1.查找收到的评论:
select count(*) from Comment where parent.user_id=1;
结果是12.查到发出的评论:
select count(*) from Comment where user_id=1;
结果是13.查找全部的评论:
select count(*) from Comment where parent.user_id=1 or user_id=1;
结果却仍然是1后来我查看了HQL生成的SQL语句,其中的where部分括号位置不合要求,简写如下:
... where comment0_.parent_id=comment1_.id and (comment1_.user_id=1 or comment0_.user_id=1)
他居然先入为主地先将两个表做连接了,而我的本意应该是改变一下括号的顺序:
... where (comment0_.parent_id=comment1_.id and comment1_.user_id=1) or comment0_.user_id=1
甚至都不用加括号,我觉得我的HQL语句没错,但是不知道怎么会生成这样的SQL语句,我自己又没法控制!不知道能有谁指点一下正确的HQL语句吗?(虽然我的HQL语句在逻辑上算也是正确的)
解决方案 »
- java web 程序员能走多远??? 该向哪方面发展???请高人指点
- 用hibernate操作两个数据库时的保存错误,高手来看下
- 大家在写事务的时候是用Java的事务还是用数据库的事务?为什么
- 关于java设计模式
- structs 2.0配置问题
- 请教,我的actionform怎么拿不到属性字段里的值。拿的全是空值null
- B/S与WEB有何区别?
- 使用dom4j时发生了OutOfMemoryError错误,怎么解决啊
- tomcat+struts配置数据源
- 在jb8中建cmp时要一个一个字段地添加吗?并且“是不是主键”这些确定的信息都要自己来添加吗?能不能自动建立?
- 一个JAVA高斯消去法问题,有点小错误不会改,麻烦各位了,好的给高分,急~~~~~~~~
- 新手:foreach的使用问题
1 1 null
2 2 1 user_id为1的本来就只有一条啊!
id user_id parent_id
1 1 null
2 2 1
也就是说,user 1发表了一篇评论,user 2评论了user 1的评论 目标:查找user 1发出和收到的评论(本来理论上应该为2,但是): HQL语句:
1.查找收到的评论:
select count(*) from Comment where parent.user_id=1;
结果是1 2.查到发出的评论:
select count(*) from Comment where user_id=1;
结果是1 3.查找全部的评论:
select count(*) from Comment where parent.user_id=1 or user_id=1;
结果却仍然是1
和你的表对了一下,好像都对,没有错吧
那HQL语句就直接可以写为
select count(*) from Comment user_id=1 or parent_id=1在hibernate映射文件里面不需要配置映射关系的,要不然的话肯定会有问题
id user_id parent_id
1 1 null 注:user 1发出的评论
2 2 1 注:user 2给user 1的评论,即user 1收到的评论
用你的HQL能够查到结果我想要的结果,但是如果数据变化后,如下:
id user_id parent_id
11 1 null 注:user 1发出的评论
21 2 11 注:user 2给user 1的评论,即user 1收到的评论
用你的查询语句就得不到查询user 1收到的和发出的全部评论了
所以必须确定parent.user_id=1才行
where
comment0_.parent_id=comment1_.id
and (
comment1_.user_id=?
or comment0_.user_id=?
and (
comment0_.parent_id is null
)
)明显第一个and连接就错了吗,我的本意应该是:
where
comment0_.parent_id=comment1_.id
and (
comment1_.user_id=?
)
or comment0_.user_id=?
这个地方HQL怎么会有错,
你的select count(*) from Comment where parent.user_id=1 or user_id=1这一句给他的意思本来就是这样,你的parent.user_id并等同于parent_id,你是不是在数据库中自己与自己表建立了主外键关系??
如果是的话,就得改一下Pojo和配置文件,必须有一个字段直接关系parent_id而不是以对象形式关联