HQL group by 语句和ManyToOne 一起使用时常出的错

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值