2016-06-15 8 views
3

Ich habe Funktion in meiner DAO-Implementierung für Abfrage ausgeführtORA-00979: keine GROUP BY-Ausdruck

SQL QUERY:

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 

Dies läuft in db gut, aber Fehler geben, wenn sie von Hibernate Code ausführen .

FUNKTION:

@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(); 
    } 

KONSOLE:

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 

Ich weiß nicht, warum es diese GROUP BY Fehler geben, wenn die Abfrage fein in SQL-Entwickler ausgeführt wird.

+0

Ich weiß nichts über Hibernate, aber die ersten beiden Zeilen von Ihrer Konsole Ausgabe sehen interessant aus. Es scheint, Sie haben zwei verschiedene SQL-Anweisungen? Der erste scheint richtig gebildet zu sein, aber der zweite ist definitiv nicht. Es gibt eine Reihe von Elementen in der zweiten Auswahl, die nicht in der Gruppe enthalten sind. –

Antwort

2

Was versuchst du zu tun?

Wenn Sie die HAVING-Klausel verwenden, müssen Sie eine Aggregationsfunktion für die dort angegebenen Spalten verwenden, da Sie diese Abfrage gruppieren. Ich habe es einfach in einen einfachen WHERE-Klausel geändert, keine Notwendigkeit, in der HAVING angegeben werden.

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 

Die HAVING-Klausel Oracle ist in Kombination mit dem GROUP BY-Klausel zu beschränken, die Gruppen von zurückgegebenen Zeilen nur auf denjenigen, die die Bedingung wahr verwendet.

+0

ich habe dies ändern, wie Sie gesagt haben, aber wieder ist es das gleiche Fehler –

+0

Select pct.IA_FILING_METHOD_CODE_ID geben, (*) von Ia_Dossier pct zählen, wobei 1 = 1 und pct.INTERNATIONAL_FILING_DATE nicht null ist und pct.INTERNATIONAL_FILING_DATE> = '11- SEP 08' \t \t und pct.INTERNATIONAL_FILING_DATE <= '11-Sep-16' und pct.IA_FILING_METHOD_CODE_ID nicht null Gruppe von pct.IA_FILING_METHOD_CODE_ID –

1

Welche Daten werden von der Datenbank angezeigt, wenn Sie Ihren SQL-Code ausführen? Es könnte sein, dass pct.IA_FILING_METHOD_CODE_IDNULL ist?

Sie müssen alle Spalten der SELECT in den GROUP BY bzw. Funktionen auf sie auszuüben, die die Ergebnisse auf einen einzelnen Wert (wie MIN, MAX oder SUM) komprimieren.

Versuchen Sie, das gesamte jpqlQuery zu drucken und vergleichen Sie es mit dem SQL, das Sie in Ihrer DB verwenden. (Beitrag auch beide SQL-Abfragen hier)

Mehr Infos über ein GROUP BY

+0

Select pct.iaFilingMethod, count (*) von IaDossier als pct wobei 1 = 1 und pct.internationalFilingDate ist nicht null und pct.internationalFilingDate> =: startDate und pct.internationalFilingDate <=: endDate-Gruppe von pct.iaFilingMethod mit pct.iaFilingMethod ist nicht null –

+0

in hebernate Abfrage ibuilding Joins für den Füllcode und das Herausnehmen von Daten von dort –

0

i auf den Grund dieses Fehlers schließlich bekam, in meiner JPA-Entität IA_FILING_METHOD_CODE_ID auf fetch.EAGER gesetzt wurde, das ist, warum es automatische machte verbindet zu anderem Tisch, vielen Dank für die Hilfe, die hat mich in die richtige Richtung bewegt. :)