简体   繁体   English

使用@Query和@Modifying的Spring数据JPA PSQLException

[英]Spring data JPA PSQLException using @Query and @Modifying

Using spring-boot-starter-data-jpa (Version 2.0.4.RELEASE) and PostgreSQL (Version 9.5.10), I keep getting the PSQLException : No results were returned by the query, though I did use @Modifying as proposed by many others here. 使用spring-boot-starter-data-jpa(版本2.0.4.RELEASE)和PostgreSQL(版本9.5.10),我不断得到PSQLException :尽管我确实使用了@Modifying ,但查询未返回任何结果。这里还有很多其他人。 Adding @Transactional as suggested by some, didn't make a difference either. 正如某些人建议的那样,添加@Transactional也不起作用。 Analyzing the StackTrace one could see that org.postgresql.jdbc.PgPreparedStatement.executeQuery() is called, whereas org.postgresql.jdbc.PgPreparedStatement.executeUpdate() should be called. 分析一下StackTrace,可以看到调用了org.postgresql.jdbc.PgPreparedStatement.executeQuery() ,而应该调用了org.postgresql.jdbc.PgPreparedStatement.executeUpdate() What can I do? 我能做什么?

@Repository
public interface Rank extends JpaRepository<RankArticle, String> {

@Modifying
@Query(value = "UPDATE rank SET id=calc.id, shop_id=calc.shop_id, " +
                "score=calc.score, rank = calc.rank FROM " +
                    "(SELECT id, shop_id, SUM(sales) AS score, CAST(NULL AS INT) AS rank " +
                    "FROM " +
                        "(SELECT id, sales, shop_id FROM daily_pod " +
                        "WHERE shop_id = :shopId " +
                        "UNION " +
                        "SELECT id, sales, shop_id FROM weekly_pod " +
                        "WHERE shop_id = :shopId " +
                        "UNION " +
                        "SELECT id, sales, shop_id FROM end_pod " +
                        "WHERE shop_id = :shopId) " +
                    "AS pods " +
                    "GROUP BY id, shop_id ORDER BY score DESC limit :limit) as calc;"
        , nativeQuery = true)
void calcScore(@Param("shopId") Integer shopId,
               @Param("limit") Integer limit);

} }

EDIT: Add Full Stack-Trace: 编辑:添加完整的堆栈跟踪:

 [ERROR] 2018-09-20 17:49:10,503 [SimpleAsyncTaskExecutor-1] [dtpvbackend.VerkaufsrangConfig] - Konnte AMQP-Nachricht nicht 

verarbeiten! verarbeiten! org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void de.thalia.pim.verkaufsrang.backend.application.rabbitmq.SalesHandler.receive(org.springframework.amqp.core.Message)' threw exception at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:190) at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:120) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1414) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1337) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1324) at org.springframework.amqp.rabbit.listener.AbstractMessageLi org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException:侦听器方法'public void de.thalia.pim.verkaufsrang.backend.application.rabbitmq.SalesHandler.receive(org.springframework.amqp.core.Message)'抛出异常在org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:190)在org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:120)处org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1337)上的.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1414)在org.springframework.amqp.rabbit.listener .invokeListener(AbstractMessageListenerContainer.java:1324)在org.springframework.amqp.rabbit.listener.AbstractMessageLi stenerContainer.executeListener(AbstractMessageListenerContainer.java:1303) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:817) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:801) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:77) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1042) at java.base/java.lang.Thread.run(Thread.java:844) Caused by: org.springframework.orm.jpa.JpaSystemException: could not extract ResultSet; org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:817)上的stenerContainer.executeListener(AbstractMessageListenerContainer.java:1303)在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.java 801)在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1042)在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ AsyncMessageProcessingConsumer.run $ java(SimpleMessageListenerContainer.java:1042) base / java.lang.Thread.run(Thread.java:844)由以下原因引起:org.springframework.orm.jpa.JpaSystemException:无法提取ResultSet;因此无法创建ResultSet。 nested exception is org.hibernate.exception.GenericJDBCException: could not extract ResultSet at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:314) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:225) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.data.jpa.reposit 嵌套的异常是org.hibernate.exception.GenericJDBCException:无法在org.springframework.orm.jpa.vendor.HibernateJateDial。 (HibernateJpaDialect.java:225)在org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527)在org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTransorg.java.spring:61) org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)上的dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java: 185)在org.springframework.data.jpa.reposit ory.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy123.calcScore(Unknown Source) at de.thalia.pim.verkaufsrang.backend.business.SalesRankService.calculateRank(SalesRankService.java:28) at de.thal org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)上的ory.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135)在org.springframework.aop.InterceptorInpose。 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)处org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)处的org.spring.java:92) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)处com.sun.proxy。$ Proxy123.calcScore(Unknown Source)的.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) de.thal上的de.thalia.pim.verkaufsrang.backend.business.SalesRankService.calculateRank(SalesRankService.java:28) ia.pim.verkaufsrang.backend.application.rabbitmq.SalesHandler.receive(SalesHandler.java:60) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:181) at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:114) at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:51) at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:182) ... 10 common frames omitted Caused by: org.hibernate.exception.GenericJDBCException: ia.pim.verkaufsrang.backend.application.rabbitmq.SalesHandler.receive(SalesHandler.java:60)在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在java.base / jdk.internal.reflect .java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)上的.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),java.base / java.lang.reflect.Method.invoke(Method.java) :564),位于org.springframework的org.springframework.messaging.handler.invocation.InvocableHandlerMethod.dovv(InvocableHandlerMethod.java:114),位于org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:181)。 org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:182)处的amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:51)...省略了10个常见框架:org.hibernate.exception.GenericJDBCException: could not extract ResultSet at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:69) at org.hibernate.loader.Loader.getResultSet(Loader.java:2168) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1931) at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1893) at org.hibernate.loader.Loader.doQuery(Loader.java:938) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) at org.hibernate.loader.Loader.doList(Loader.java:2692) at org.hibernate.loader.Loader.doList(Loader.java:2675) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507) at org.hibernate.loader.Loader.list(Loader.java:2502) at o 无法在org.hibernate.engine的org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)的org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)处提取ResultSet org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:69)处的.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)org.hibernate.loader.Loader.getResultSet(Loader.java) :2168),位于org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1931),位于org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1893),位于org.hibernate.loader.Loader.doQuery(Loader。 java:938)位于org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)位于org.hibernate.loader.Loader.doList(Loader.java:2692)at org.hibernate.loader.Loader.doList(Loader .org:hibernate.loader.Loader.list上的.java:2675)org.hibernate.loader.Loader.list(Loader.java:2502)上的IgnoreQueryCache(Loader.java:2507) rg.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335) at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2200) at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1016) at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:152) at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414) at org.hibernate.query.Query.getResultList(Query.java:146) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:380) at com.sun.proxy.$Proxy141.getResult 位于org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2200)的rg.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335)位于org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java: 1016)位于org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:152)位于org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)位于org.hibernate.query.Query.getResultList (Query.java:146)在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在java.base org.springframework.orm.jpa.SharedEntityManagerCreator $ DeferredQueryInvocationHandler上的java.base / java.lang.reflect.Method.invoke(Method.java:564)上的/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) .invoke(SharedEntityManagerCreator.java:380)在com.sun.proxy。$ Proxy141.getResult List(Unknown Source) at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:129) at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91) at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136) at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:590) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:578) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59) at o 在org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java)的org.springframework.data.jpa.repository.query.JpaQueryExecution $ CollectionExecution.doExecute(JpaQueryExecution.java:129)处列出(未知源) :91)在org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136)在org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125)在org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:578)上的org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:590) org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)上的org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) rg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ... 29 common frames omitted Caused by: org.postgresql.util.PSQLException: No results were returned by the query. org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)上的rg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)在org.springframework.transaction.interceptor.TransactionInterceptor.invoke org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)的事务Interceptor.java:98)org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)... 29个常见框架省略的原因:org.postgresql.util.PSQLException:查询未返回任何结果。 at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60) ... 63 common frames omitted 在org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)在com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)在com.zaxxer.hikari.pool.HikariProxyPreparedStatement。 .java),位于org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60)...省略了63个共同的框架

Managed to get it working by changing the statement into an INSERT INTO ... ON CONFLICT (...) DO UPDATE one: 通过将语句更改为INSERT INTO ... ON CONFLICT(...)进行更新来设法使其工作:

@Transactional
public interface Rank extends CrudRepository<RankArticle, Identity> {

    @Modifying
    @Query(value = "INSERT INTO rank" +
                        "(SELECT id, shop_id, SUM(sales) AS score, CAST(NULL AS INT) AS rank " +
                        "FROM " +
                            "(SELECT id, shop_id, sales FROM daily_pod " +
                            "WHERE shop_id = :shopId " +
                            "UNION " +
                            "SELECT id, shop_id, sales FROM weekly_pod " +
                            "WHERE shop_id = :shopId " +
                            "UNION " +
                            "SELECT id, shop_id, sales FROM end_pod " +
                            "WHERE shop_id = :shopId) " +
                        "AS pods " +
                        "GROUP BY id, shop_id ORDER BY score DESC LIMIT :limit) " +
                "ON CONFLICT (id) DO UPDATE " +
                "SET shop_id = EXCLUDED.shop_id, score = EXCLUDED.score, " +
                    "rank_count = EXCLUDED.rank_count;"
        , nativeQuery = true)
void calcScore(@Param("shopId") Integer shopId,
               @Param("limit") Integer limit);

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM