Spring data JPA PSQLException с использованием @Query и @Modifying - PullRequest
0 голосов
/ 21 сентября 2018

Используя spring-boot-starter-data-jpa (Версия 2.0.4.RELEASE) и PostgreSQL (Версия 9.5.10), я получаю PSQLException : запрос не дал результатов,хотя я использовал @Modifying, как предлагали многие другие здесь.Добавление @Transactional, как предлагают некоторые, также не имело значения.Анализируя StackTrace, можно увидеть, что вызывается org.postgresql.jdbc.PgPreparedStatement.executeQuery(), а org.postgresql.jdbc.PgPreparedStatement.executeUpdate().Что я могу сделать?

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

}

РЕДАКТИРОВАТЬ: Добавить полную трассировку стека:

[ERROR] 2018-09-20 17:49:10,503 [SimpleAsyncTaskExecutor-1] [d.t.p.v.backend.VerkaufsrangConfig] - Konnte AMQP-Nachricht nicht

verarbeiten!org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: метод прослушивателя 'public void de.thalia.pim.verkaufsrang.backend.application.rabbitmq.SalesHandler.receive (org.springframework.amqpessв org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler (MessagingMessageListenerAdapter.java:190) в org.springframework.amqp.rabbit.listener.adapter.MessagingMessagef.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener (AbstractMessageListenerContainer.java:1414) в org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener.invokeListener (AbstractMessageListenerContainer.java:1324) в org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener (AbstractMessageListenerContainer.java:1303) при org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute (SimpleMessageListenerContainer.java:817) в org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute (SimpleMessageListenerContainer.java:801) в org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access $ 700 (SimpleMessageListenerContainer.java:77) в org.springframework.amqp.rabbit.listener.SimpleMessageLageerContainerbase / java.lang.Thread.run (Thread.java:844) Причина: org.springframework.orm.jpa.JpaSystemException: не удалось извлечь ResultSet;Вложенное исключение - org.hibernate.exception.GenericJDBCException: не удалось извлечь ResultSet в org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException (HibernateJpaDialect.java:314).(HibernateJpaDialect.java:225) при org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible (AbstractEntityManagerFactoryBean.java:527) при org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible (ChainedPersistenceExceptionTranslator.java:61) при org.springframework.Дао185) на org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke (CrudMethodMetadataPostProcessor.java:135) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:185) в org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.Java: 92)в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:185) в org.springframework.data.repository.core.support. SurroundTransactionwork.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:185) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:212) в com.un.proxy.pim.verkaufsrang.backend.business.SalesRankService.calculateRank (SalesRankService.java:28) в de.thalia.pim.verkaufsrang.backend.application.rabbitmq.SalesHandler.receive (SalesHandler.java:60 / jk).internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в java.base / jdk.hoccess.indAccessorImpl.java:43) в java.base / java.lang.reflect.Method.invoke (Method.java:564) в org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke (InvocableHandjg): 18.springframework..listener.adapter.MessagingMessageListenerAdapter.invokeHandler (MessagingMessageListenerAdapter.java:182) ... 10 общих опущенных фреймов. Причина: org.hibernate.exception.GenericJDBCException: не удалось извлечь ResultSet в org.hibernate.conntStandardSQLExceptionConverter.java:47) в org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:111) в org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (Sqljava):.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract (ResultSetReturnImpl.java:69) в org.hibernate.loader.Loader.getResultSet (Loader.java:2168) в org.hibernate.loader.Loader.executeQueryStatement (Loader.javag: 19).Loader.executeQueryStatement (Loader.java:1893) в org.hibernate.loader.Loader.doQuery (Loader.java:938) в org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader.javag: h1).loader.Loader.doList (Loader.java:2692) в org.hibernate.loader.Loader.doList (Loader.java:2675) в org.hibernate.loader.Loader.listIgnoreQueryCache (Loader.java:2507) в org.hibernate.loader.Loader.list (Loader.java:2502) в org.hibernate.loader.custom.CustomLoader.list (CustomLoader.java:335) в org.hibernate.internal.SessionImpl.listCustomQuery (SessionImpl.java:2200) в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 (собственный метод)/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) в java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessor.etho.j.fj.jb.jmpl.jb.jmpl..invoke (Method.java:564)в org.springframework.orm.jpa.SharedEntityManagerCreator $ DeferredQueryInvocationHandler.invoke (SharedEntityManagerCreator.java:380) в com.sun.proxy. $ Proxy141.getResultList (Неизвестный источник).$ CollectionExecution.doExecute (JpaQueryExecution.java:129) по адресу org.springframework.data.jpa.repository.query.JpaQueryExecution.execute (JpaQueryExecution.java:91) по адресу org.springframework.data.jpaQ.(AbstractJpaQuery.java:136) в org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute (AbstractJpaQuery.java:125) в org.springframework.data.repository.core.support.RepositoryFort.java: 590) в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke (RepositoryFactorySupport.java:578) в org.springframework.aop.finmef.ctiveMethodInvocation.java:185) в org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke (DefaultMethodInvokingMethodInterceptor.java:59) в org.springframework.a.jpg.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:294) в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:98) в org.springframeworkethoho.jpg) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:139) ... пропущено 29 общих фреймов.по адресу org.postgresql.jdbc.PgPreparedStatement.executeQuery (PgPreparedStatement.java:114) по адресу com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery (ProxyPreparedStatement.jexservice.pl.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract (ResultSetReturnImpl.java:60) ... 63 общих кадра опущено

1 Ответ

0 голосов
/ 25 сентября 2018

удалось заставить его работать, изменив инструкцию на INSERT INTO ... ON CONFLICT (...) DO UPDATE one:

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

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...