Hibernate中莫名其妙的GROUP BY

defencez 2009-10-23 01:07:41
环境:Spring 2.5 + Hibernate3.2

HQL: select department.organize.id,department.organize.organizename,max(department.createdate) from Department department group by department.organize.id,department.organize.organizename

说明: Department是部门表,Organize是企业表, 部门表与企业表是多对一关系,这已通过映射文件分别做了多对一及一对多映射。Department中有属性organize

通过Spring的getHibernateTemplate().find(HQL)//HQL为上面所写的HQL语句。

执行时出现错误,错误提示:Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)

看着这不知所云的错误提示(选择列表中存在无效表达式,不能包括集聚函数或Group by子句),于是修改了一下HQL,修改后的HQL为:

HQL:select department.organize.id,max(department.createdate) from Department department group by department.organize.id

执行通过,执行结果正确。

这两句HQL区别只是第一个在选择列表及Group by中多了一个字段,另外,所有HQL均书写正确,已仔细比对过。



不知第一句到底错在哪里?
...全文
227 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
oxcow 2009-10-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 defencez 的回复:]
2楼:

根据分组条件,若organizename有很多,如下:
001  name1
001  name2
001  name3

则max(...) 会分别根据分组集中一二三分组得到三个分组中的各自最大DATE,这是基本的SQL规则,有什么问题吗?
[/Quote]
SQL没有那么智能,无法通过日期唯一标识一行数据。知道日期并不意味之知道日期对应那一行数据的name
defencez 2009-10-23
  • 打赏
  • 举报
回复
感谢1、2楼的回复

问题解决了,还是莫名其妙,按第一句HQL的做法,它又通过了。这个问题实在折磨了我一个晚上。
defencez 2009-10-23
  • 打赏
  • 举报
回复
2楼:不是跟分组有关的数据列要给定数据库一个如何获取的规则


请仔细看第一句HQL,organizename列已在分组中,若不在分组中,写成SQL也通不过
defencez 2009-10-23
  • 打赏
  • 举报
回复
2楼:

根据分组条件,若organizename有很多,如下:
001 name1
001 name2
001 name3

则max(...) 会分别根据分组集中一二三分组得到三个分组中的各自最大DATE,这是基本的SQL规则,有什么问题吗?
oxcow 2009-10-23
  • 打赏
  • 举报
回复
第一句查出来的分组结果集中organizename会有多,数据库不知道要提取同组的哪一个organizename。因此对于group by 的SQL,不是跟分组有关的数据列要给定数据库一个如何获取的规则。也就是要确保非分组列是唯一能确定的,因为根据分组条件条件分组出来的数据同一列可能会有不同值。

因此如果第一条SQL要成功的话 将 department.organize.organizename 改成 max(department.organize.organizename) 就可以了
youjianbo_han_87 2009-10-23
  • 打赏
  • 举报
回复
HQL转换成 SQL挺复杂的,尤其是对象。 你先把 showsql设置为 true,然后看它生成了什么SQL,然后贴出来到DB工具运行,就知道错在哪里了。毕竟看SQl能更好看出问题。

不行,你再把生成的SQL贴出来,大家帮你分析。

81,091

社区成员

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

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