HQL group by 语句和ManyToOne 一起使用时常出的错
来源:互联网 发布:食品安全专业出国 知乎 编辑:程序博客网 时间:2024/06/08 07:56
HQL语句
String queryString = "select sum(dvd.count),dvd.dvdType from DvdTable1 dvd
group bydvd.dvdType";
从HQL语法的角度,这条语句没错,dvd.dvdType作为groupby条件, 也被select 显示出来
但执行时,从[Debug info]观察,hibernate 组成下面的语句
Hibernate:
select
sum(dvdtable1x0_.count) as col_0_0_,
dvdtable1x0_.dvdType_id as col_1_0_,
dvdtype1_.id asid1_, //显示dvd.dvdType的所有属性
dvdtype1_.name asname1_ //显示dvd.dvdType的所有属性
from
DvdTable1 dvdtable1x0_
innerjoin
DvdType dvdtype1_
on dvdtable1x0_.dvdType_id=dvdtype1_.id
group by
dvdtable1x0_.dvdType_id
// groupby的条件取的其实是表的外键字段,而不是整个外键所指的One对象的所有字段这就造成了group by的原则问题:不在groupby条件内,也不被聚合函数处理的字段,不允许被select出来
oracle 报错:
Caused by: java.sql.SQLException: ORA-00979: not a GROUP BYexpression解决: HQL改成如下
select sum(dvd.count),dvd.dvdType.id,dvd.dvdType.name fromDvdTable1 dvd
group by dvd.dvdType.id,dvd.dvdType.name
既然你想显示type.name,就把type,name作为group by条件,就可以select了
Hibernate:
select
sum(dvdtable1x0_.count) as col_0_0_,
dvdtable1x0_.dvdType_id as col_1_0_,
dvdtype1_.name as col_2_0_
from
DvdTable1 dvdtable1x0_,
DvdTypedvdtype1_
where
dvdtable1x0_.dvdType_id=dvdtype1_.id
group by
dvdtable1x0_.dvdType_id ,
dvdtype1_.name
COL_0_0_ COL_1_0_ COL_2_0_
---------- --------------------------------------------------
3
String queryString = "select sum(dvd.count),dvd.dvdType from DvdTable1 dvd
从HQL语法的角度,这条语句没错,dvd.dvdType作为groupby条件, 也被select 显示出来
但执行时,从[Debug info]观察,hibernate 组成下面的语句
Hibernate:
oracle 报错:
Caused by: java.sql.SQLException: ORA-00979: not a GROUP BYexpression解决: HQL改成如下
select sum(dvd.count),dvd.dvdType.id,dvd.dvdType.name fromDvdTable1 dvd
既然你想显示type.name,就把type,name作为group by条件,就可以select了
Hibernate:
---------- --------------------------------------------------