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_
---------- --------------------------------------------------
               47 TypeExample27
               44 TypeExample24
               48 TypeExample28
               41 TypeExample21
               46 TypeExample26
               42 TypeExample22
               49 TypeExample29
               50 TypeExample210
               43 TypeExample23
               45 TypeExample25

10 rows selected.

原文:http://blog.sina.com.cn/s/blog_6151984a0100kf1x.html