Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错误:列";这个“phitorsionangle”;必须出现在GROUP BY子句中或在聚合函数中使用_Java_Hibernate_Postgresql_Group By_Criteria - Fatal编程技术网

Java 错误:列";这个“phitorsionangle”;必须出现在GROUP BY子句中或在聚合函数中使用

Java 错误:列";这个“phitorsionangle”;必须出现在GROUP BY子句中或在聚合函数中使用,java,hibernate,postgresql,group-by,criteria,Java,Hibernate,Postgresql,Group By,Criteria,我在sql查询方面遇到了一些问题。我正在使用Hibernate条件构建查询。我从数据库中创建了一些容器,方法是将值舍入一定的间隔(容器大小),然后对它们进行分组。当我直接在SQL中尝试使用查询时,效果非常好: SELECT floor(phiTorsionAngle / 2) * 2 as phiTorsionAngleBin, floor(psiTorsionAngle / 2) * 2 as psiTorsionAngleBin, floor(phiTorsi

我在sql查询方面遇到了一些问题。我正在使用Hibernate条件构建查询。我从数据库中创建了一些容器,方法是将值舍入一定的间隔(容器大小),然后对它们进行分组。当我直接在SQL中尝试使用查询时,效果非常好:

SELECT floor(phiTorsionAngle / 2) * 2 as phiTorsionAngleBin, floor(psiTorsionAngle / 2) * 2 as psiTorsionAngleBin, floor(phiTorsionAngle / 2) + 180 as phiTorsionAngleBinIndex, floor(psiTorsionAngle / 2) + 180 as psiTorsionAngleBinIndex, count(*) as numberOfResidues FROM residue WHERE phitorsionangle IS NOT NULL AND psitorsionangle IS NOT NULL GROUP BY phiTorsionAngleBin, psiTorsionAngleBin
ScrollableResults phiPsiBins = createCriteria()
.setProjection(Projections.projectionList()
       .add(Projections.sqlGroupProjection(
         "floor(phiTorsionAngle / " + binSize + ") * " + binSize + " as phiTorsionAngleBin, " +
         "floor(psiTorsionAngle / " + binSize + ") * " + binSize + " as psiTorsionAngleBin, " +         
         "floor(phiTorsionAngle / " + binSize + ") + 180 as phiTorsionAngleBinIndex, " +
         "floor(psiTorsionAngle / " + binSize + ") + 180 as psiTorsionAngleBinIndex, " + 
         "count(*) as numberOfResidues",
         "phiTorsionAngleBin, psiTorsionAngleBin",
         new String[] {"phiTorsionAngleBin", "psiTorsionAngleBin", "phiTorsionAngleBinIndex", "psiTorsionAngleBinIndex", "numberOfResidues"},
         new Type[] {Hibernate.DOUBLE, Hibernate.DOUBLE, Hibernate.INTEGER, Hibernate.INTEGER, Hibernate.INTEGER})))
.add(Restrictions.isNotNull("phiTorsionAngle"))
.add(Restrictions.isNotNull("psiTorsionAngle"))
.setResultTransformer(Transformers.aliasToBean(PhiPsiBinResult.class))
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
这是我收到的错误消息,下面是完整的堆栈跟踪:

ERROR: column "this_.phitorsionangle" must appear in the GROUP BY clause or be used in an aggregate function WARN 2011-01-11 16:13:43,047 main JDBCExceptionReporter:100 - SQL Error: 0, SQLState: 42803 ERROR 2011-01-11 16:13:43,047 main JDBCExceptionReporter:101 - ERROR: column "this_.phitorsionangle" must appear in the GROUP BY clause or be used in an aggregate function Position: 143 Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query using scroll at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.loader.Loader.scroll(Loader.java:2340) at org.hibernate.loader.criteria.CriteriaLoader.scroll(CriteriaLoader.java:113) at org.hibernate.impl.SessionImpl.scroll(SessionImpl.java:1561) at org.hibernate.impl.CriteriaImpl.scroll(CriteriaImpl.java:320) at nl.ru.cmbi.pdbeter.core.controller.DAO.ResidueDAO.getPhiPsiBinSet(ResidueDAO.java:236) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at $Proxy27.getPhiPsiBinSet(Unknown Source) at nl.ru.cmbi.pdbeter.statistics.controller.StatisticsFunctions.makeRamachandranPlot(StatisticsFunctions.java:26) at nl.ru.cmbi.pdbeter.statistics.controller.StatisticsMain.start(StatisticsMain.java:39) at nl.ru.cmbi.pdbeter.statistics.controller.StatisticsMain.main(StatisticsMain.java:33) Caused by: org.postgresql.util.PSQLException: ERROR: column "this_.phitorsionangle" must appear in the GROUP BY clause or be used in an aggregate function Position: 143 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271) at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) at org.hibernate.loader.Loader.getResultSet(Loader.java:1812) at org.hibernate.loader.Loader.scroll(Loader.java:2305) ... 18 more 错误:列“this_u.phitorionAngle”必须出现在GROUP BY子句中或在聚合函数中使用 警告2011-01-11 16:13:43047主JDBCExceptionReporter:100-SQL错误:0,SQLState:42803 错误2011-01-11 16:13:43047主JDBCExceptionReporter:101-错误:列“this_u.phitorsionangle”必须出现在GROUP BY子句中,或在聚合函数中使用 职位:143 线程“main”org.hibernate.Exception.sqlgrammareexception中出现异常:无法使用scroll执行查询 位于org.hibernate.exception.sqlstatecoverter.convert(sqlstatecoverter.java:90) 位于org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66) 位于org.hibernate.loader.loader.scroll(loader.java:2340) 位于org.hibernate.loader.criteria.CriteriaLoader.scroll(CriteriaLoader.java:113) 位于org.hibernate.impl.SessionImpl.scroll(SessionImpl.java:1561) 在org.hibernate.impl.CriteriaImpl.scroll上(CriteriaImpl.java:320) 位于nl.ru.cmbi.pdbeter.core.controller.DAO.ResidueDAO.getPhiPsiBinSet(ResidueDAO.java:236) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:616) 位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:150)上 位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172) 位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 位于$Proxy27.getPhiPsiBinSet(未知来源) 位于nl.ru.cmbi.pdbeter.statistics.controller.StatisticsFunctions.makeRamachandranPlot(StatisticsFunctions.java:26) 位于nl.ru.cmbi.pdbeter.statistics.controller.StatisticsMain.start(StatisticsMain.java:39) 位于nl.ru.cmbi.pdbeter.statistics.controller.StatisticsMain.main(StatisticsMain.java:33) 原因:org.postgresql.util.PSQLException:错误:列“this.phitorionAngle”必须出现在GROUP by子句中或在聚合函数中使用 职位:143 位于org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) 位于org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) 位于org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 位于org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) 位于org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) 位于org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271) 位于org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 位于org.hibernate.loader.loader.getResultSet(loader.java:1812) 位于org.hibernate.loader.loader.scroll(loader.java:2305) ... 还有18个 我试着通过将phiTorsionAngle和psiTorsionAngle添加到组中,这似乎有效,但这样做没有意义。我不想按phiTorsionAngle的每个可能值分组,我想按整个容器分组,可能包含很多不同的phiTorsionAngle值。为什么它会给我这个错误,我如何解决它


更新:直到查询完成,我才真正尝试让它运行,我得到了一个Java堆外空间错误,因为它试图加载大约1900万个条目,因此,现在将phiTorsionAngle和psiTorsionAngle添加到分组中是完全不可能的:)

我想我还不够清楚:我无法按phiTorsionAngle或psiTorsionAngle进行分组,因为这违背了查询的目的。我需要一组phiTorsionAngleBin和psiTorsionAngleBin。此外,正如您在我的更新中所读到的:在Java中执行您所说的操作将导致堆空间错误,因为它将尝试将大约1900万个结果加载到内存中。尝试启用SQL日志记录:
SELECT  phiTorsionAngleHalfFloor * 2 as phiTorsionAngleBin, 
        psiTorsionAngleHalfFloor * 2 as psiTorsionAngleBin, 
        phiTorsionAngleHalfFloor + 180 as phiTorsionAngleBinIndex, 
        psiTorsionAngleHalfFloor + 180 as psiTorsionAngleBinIndex, 
        numberOfResidues
FROM    (
        SELECT  FLOOR(phiTorsionAngleHalf / 2) AS phiTorsionAngleHalfFloor,
                FLOOR(psiTorsionAngleHalf / 2) AS psiTorsionAngleHalfFloor,
                COUNT(*) AS numberOfResidues
        FROM    residue
        WHERE   phitorsionangle IS NOT NULL
                AND psitorsionangle IS NOT NULL
        GROUP BY
                phiTorsionAngleHalfFloor, psiTorsionAngleHalfFloor
        ) q