2016-06-15 108 views
3

我在DAO实现由功能运行的查询ORA-00979:不是GROUP BY表达式

SQL查询:

SELECT pct.IA_FILING_METHOD_CODE_ID, COUNT(*) 
      FROM Ia_Dossier pct 
      WHERE 1=1 and pct.INTERNATIONAL_FILING_DATE IS NOT NULL 
      AND pct.INTERNATIONAL_FILING_DATE>='11-SEP-08' 
      AND pct.INTERNATIONAL_FILING_DATE<='11-SEP-16' 
      GROUP BY pct.IA_FILING_METHOD_CODE_ID 
      HAVING pct.IA_FILING_METHOD_CODE_ID IS NOT NULL 

这是运行在数据库罚款,但给错误从休眠状态代码运行时。

功能:

@Override 
    public List<Object[]> findStatsByROGroupedByFileFormat(Date startDate, Date endDate,String RO, String groupBy) { 

     StringBuilder jpqlQuery = new StringBuilder(); 
     jpqlQuery.append("Select pct.").append(groupBy).append(",count(*) from IaDossier as pct where 1=1 and pct.internationalFilingDate is not null"); 
     if(startDate!=null) 
     { 
      jpqlQuery.append(" and pct.internationalFilingDate >=:startDate"); 
     } 
     if(endDate!=null) 
     { 
      jpqlQuery.append(" and pct.internationalFilingDate <=:endDate"); 
     } 

     if(groupBy!=null && RO!=""){ 
      jpqlQuery.append(" group by pct.").append(groupBy); 
      jpqlQuery.append(" having pct.").append(groupBy).append(" is not null"); 
     } 
System.out.println(jpqlQuery+"hc"); 
     Query q = entityManager.createQuery(jpqlQuery.toString()); 
     if(startDate!=null) 
     { 
      q.setParameter("startDate", startDate); 
     } 
     if(endDate!=null) 
     { 
      q.setParameter("endDate", endDate); 
     } 
     return (List<Object[]>)q.getResultList(); 
    } 

控制台:

12:09:45,572 INFO [stdout] (http-localhost-127.0.0.1-8082-2) Select pct.iaFilingMethod,count(*) from IaDossier as pct where 1=1 and pct.internationalFilingDate is not null and pct.internationalFilingDate >=:startDate and pct.internationalFilingDate <=:endDate group by pct.iaFilingMethod having pct.iaFilingMethod is not null 

12:09:45,730 INFO [stdout] (http-localhost-127.0.0.1-8082-2) Hibernate: select iadossier0_.IA_FILING_METHOD_CODE_ID as col_0_0_, count(*) as col_1_0_, iafilingme1_.IA_FILING_METHOD_CODE_ID as IA1_52_, iafilingme1_.EN_NAME as EN2_52_, iafilingme1_.END_DATE as END3_52_, iafilingme1_.FR_NAME as FR4_52_, iafilingme1_.IS_EFILING as IS5_52_, iafilingme1_.OFFICE_RESTRICTIONS_APPLY as OFFICE6_52_, iafilingme1_.START_DATE as START7_52_ from IA_DOSSIER iadossier0_ inner join IBPROD.IA_FILING_METHODS iafilingme1_ on iadossier0_.IA_FILING_METHOD_CODE_ID=iafilingme1_.IA_FILING_METHOD_CODE_ID where 1=1 and (iadossier0_.INTERNATIONAL_FILING_DATE is not null) and iadossier0_.INTERNATIONAL_FILING_DATE>=? and iadossier0_.INTERNATIONAL_FILING_DATE<=? group by iadossier0_.IA_FILING_METHOD_CODE_ID having iadossier0_.IA_FILING_METHOD_CODE_ID is not null 

12:09:46,076 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8082-2) SQL Error: 979, SQLState: 42000 
12:09:46,078 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8082-2) ORA-00979: not a GROUP BY expression 

我不知道为什么,当查询在SQL Developer中运行良好,竟然放弃这个GROUP BY错误。

+0

我对hibernate一无所知,但控制台输出的前两行看起来很有趣。看起来你有两个不同的SQL语句?第一个似乎是正确的,但第二个绝对不是。第二个选择中有许多元素不在组中。 –

回答

2

你想做什么?

当您使用HAVING子句时,您必须对指定的列使用聚合函数,因为您正在对此查询进行分组。我只是将其更改为一个简单的WHERE子句,不需要在HAVING中指定。

SELECT pct.IA_FILING_METHOD_CODE_ID, COUNT(*) 
FROM Ia_Dossier pct 
WHERE pct.INTERNATIONAL_FILING_DATE IS NOT NULL 
    AND pct.INTERNATIONAL_FILING_DATE>='11-SEP-08' 
    AND pct.INTERNATIONAL_FILING_DATE<='11-SEP-16' 
    AND pct.IA_FILING_METHOD_CODE_ID IS NOT NULL 
GROUP BY pct.IA_FILING_METHOD_CODE_ID 

甲骨文HAVING子句组合使用与GROUP BY子句限制返回的行组,只有那些其条件为TRUE。

+0

我有改变这种像你说的,但再次它给从Ia_Dossier PCT 其中1 = 1,pct.INTERNATIONAL_FILING_DATE不为空 和pct.INTERNATIONAL_FILING_DATE> ='同样的错误 –

+0

选择pct.IA_FILING_METHOD_CODE_ID,COUNT(*),11- SEP-08' \t \t和pct.INTERNATIONAL_FILING_DATE <= '11-SEP-16' 和pct.IA_FILING_METHOD_CODE_ID不为空 组由pct.IA_FILING_METHOD_CODE_ID –

1

如果您运行sql代码,数据库中显示的数据是什么? 这可能是您的pct.IA_FILING_METHOD_CODE_IDNULL

你必须把SELECT的所有列在其上的GROUP BY或使用功能,其压缩结果为单一值(如MINMAXSUM)。

尝试打印整个jpqlQuery并将其与您在数据库中使用的SQL进行比较。 (也发布两个SQL查询这里)

更多信息有关GROUP BY

+0

选择pct.iaFilingMethod,COUNT(*)从IaDossier如PCT其中1 = 1和pct。internationalFilingDate不为null并且pct.internationalFilingDate> =:startDate和pct.internationalFilingDate <=:endDate group by pct.iaFilingMethod pct.iaFilingMethod不为null –

+0

在hebernate中查询它ibuilding加入填充代码并从那里取出数据 –

0

我终于得到这个错误的原因,在我的JPA实体IA_FILING_METHOD_CODE_ID设置为fetch.EAGER这就是为什么它正在自动加入到其他桌子,非常感谢帮助它使我朝着正确的方向前进。 :)

相关问题