2016-05-01 6 views
-1

Ich habe mariaDB benutzt, und jetzt ziehe ich nach postgres. Ich habe eine Abfrage in JPAPostgres Count ohne groupby (mit jpa)

select count(<primarykeycolumn>) from tablename where condition 

Aber Postgres gibt eine Fehlermeldung, eine group by Klausel benötigt wird.

Ich möchte keine Gruppe hinzufügen, der Code läuft mit mariaDB.

Unten ist der Fehler:

Internal Exception: org.postgresql.util.PSQLException: ERROR: column "app_movie_summary.creationdate" must appear in the GROUP BY clause or be used in an aggregate function 
    Position: 55 
Error Code: 0 
Call: SELECT COUNT(id) FROM mytable ORDER BY CREATIONDATE DESC 
Query: ReportQuery(name="App_Movie_Summary.findAllByCreationDateCount" referenceClass=App_Movie_Summary sql="SELECT COUNT(Id) FROM mytable ORDER BY CREATIONDATE DESC") 
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:684) 
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:560) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2055) 
    at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299) 
    at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:694) 
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2740) 
    at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllReportQueryRows(ExpressionQueryMechanism.java:2677) 
    at org.eclipse.persistence.queries.ReportQuery.executeDatabaseQuery(ReportQuery.java:852) 
    at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:904) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1134) 
    at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:460) 
    at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1222) 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1857) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1839) 
    at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) 
    at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:521) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:400) 
+2

Nun, das Problem ist, dass MariaDB ungültige SQL ausführt. Was soll die Abfrage ** tun? Warum willst du es nicht reparieren? –

+0

Ja, Sie wollen * eine * Gruppe von - auch in MariaDB - wenn Sie eine "richtige" Antwort wollen und nicht nur zufällige Werte. http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your-queries-fragile/ –

Antwort

0

In PostgreSQL können Sie keine Aggregatfunktionen mischen (wie count) mit nicht aggregierten Spalten (creationdates), wenn Sie GROUP BY die nicht aggregierten Spalten. In diesem Fall sieht es nicht so aus, als müssten Sie nach allen Gruppen gruppieren, weil Sie keine Notwendigkeit haben, ORDER BY creationdate. Auftrag ist für count(*) irrelevant. Diese Abfrage ist perfekt gültig:

SELECT count(*) FROM mytable 

Wenn Sie creationdate enthalten wollen, Sie mustGROUP BY es. Wenn Sie das tun, ORDER BY macht auch wieder Sinn:

SELECT creationdate, count(*) from mytable 
GROUP BY creationdate 
ORDER BY creationdate 
Verwandte Themen