2016-05-01 2 views
-1

Я использую mariaDB, и теперь я перехожу к postgres. У меня есть запрос в JPAPostgres Count без groupby (используя jpa)

select count(<primarykeycolumn>) from tablename where condition 

Но Postgres дает ошибку о том, нужна оговорка group by.

Я не хочу добавлять группу, код работает и работает с mariaDB.

Ниже ошибка:

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

Ну, проблема в том, что MariaDB выполняет недопустимую SQL. Какой запрос ** предполагается ** делать? Почему бы вам не исправить это? –

+0

Да, вы * делаете * хотите 'group by' - даже в MariaDB - если вы хотите« правильный »ответ, а не просто случайные значения. http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your-queries-fragile/ –

ответ

0

В PostgreSQL, вы не можете смешивать агрегатные функции (например, count) с неагрегированными столбцами (creationdates), если вы GROUP BY в неагрегированных колоннах. В этом случае, похоже, вам не нужна группа, потому что вам не нужно ORDER BY creationdate. Заказ не имеет отношения к count(*). Этот запрос вполне допустимо:

SELECT count(*) FROM mytable 

Если вы хотите creationdate включены, вы обязательноGROUP BY его. Когда вы сделаете это, ORDER BY также имеет смысл снова:

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