这是我与本地查询的@Repository
界面:
@Repository
public interface RecentPersonRepository extends JpaRepository<RecentPerson, Long>{
@Query(value = "select id, person_id, unique_sc_id, unique_c_id, person_first_name, person_last_name, viewed_date, dob from recent_person where person_id = ?1 order by viewed_date desc", nativeQuery = true)
List<RecentPerson> getRecentPersons(String adjusterId);
}
该方法由另一个带有@Transactional
批注的方法调用。在Spring的内部工作中,对getRecentPersons()
的调用会调用setRollbackOnly(true)
,导致其余事务失败。对getRecentPersons()
的调用实际上已完成并返回正确的结果,但是稍后提交事务时,该方法失败,因为在查询方法期间将事务设置为回滚。
Spring在某个正在处理参数的地方调用setRollbackOnly
,但我将一个值传递给该方法,并且该方法实际上完成了,即使将其设置为回滚也只会导致该方法的其余部分失败。 / p>
我的查询有问题吗?还是因为是native=true
之类的问题?
以下是导致回滚和导致最终调用setRollbackOnly
的stacktrace的异常:
java.lang.IllegalArgumentException: No parameter with index : 1 was found within the query: ReadAllQuery(referenceClass=RecentPerson sql="select id, person_id, unique_sc_id, unique_c_id, person_first_name, person_last_name, viewed_date, dob from recent_person where person_id = ?1 order by viewed_date desc").
setRollbackOnly:862, QueryImpl (org.eclipse.persistence.internal.jpa)
getParameter:966, QueryImpl (org.eclipse.persistence.internal.jpa)
getBindingFor:80, StringQueryParameterBinder (org.springframework.data.jpa.repository.query)
bind:60, StringQueryParameterBinder (org.springframework.data.jpa.repository.query)
bind:101, ParameterBinder (org.springframework.data.jpa.repository.query)
bind:76, SpelExpressionStringQueryParameterBinder (org.springframework.data.jpa.repository.query)
bindAndPrepare:161, ParameterBinder (org.springframework.data.jpa.repository.query)
bindAndPrepare:152, ParameterBinder (org.springframework.data.jpa.repository.query)
doCreateQuery:81, AbstractStringBasedJpaQuery (org.springframework.data.jpa.repository.query)
createQuery:190, AbstractJpaQuery (org.springframework.data.jpa.repository.query)
doExecute:123, JpaQueryExecution$CollectionExecution (org.springframework.data.jpa.repository.query)
execute:87, JpaQueryExecution (org.springframework.data.jpa.repository.query)
doExecute:116, AbstractJpaQuery (org.springframework.data.jpa.repository.query)
execute:106, AbstractJpaQuery (org.springframework.data.jpa.repository.query)
doInvoke:492, RepositoryFactorySupport$QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
invoke:475, RepositoryFactorySupport$QueryExecutorMethodInterceptor (org.springframework.data.repository.core.support)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:56, DefaultMethodInvokingMethodInterceptor (org.springframework.data.projection)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceedWithInvocation:99, TransactionInterceptor$1 (org.springframework.transaction.interceptor)
invokeWithinTransaction:282, TransactionAspectSupport (org.springframework.transaction.interceptor)
invoke:96, TransactionInterceptor (org.springframework.transaction.interceptor)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:136, PersistenceExceptionTranslationInterceptor (org.springframework.dao.support)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:133, CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor (org.springframework.data.jpa.repository.support)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:92, ExposeInvocationInterceptor (org.springframework.aop.interceptor)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:57, SurroundingTransactionDetectorMethodInterceptor (org.springframework.data.repository.core.support)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:213, JdkDynamicAopProxy (org.springframework.aop.framework)
getRecentPersons:-1, $Proxy193 (com.sun.proxy)
addRecentPerson:235, PersonService (com.blah.portal.services.web.service)
invoke:-1, PersonService$$FastClassBySpringCGLIB$$50ca8ee8 (com.blah.portal.services.web.service)
invoke:204, MethodProxy (org.springframework.cglib.proxy)
invokeJoinpoint:738, CglibAopProxy$CglibMethodInvocation (org.springframework.aop.framework)
proceed:157, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceedWithInvocation:99, TransactionInterceptor$1 (org.springframework.transaction.interceptor)
invokeWithinTransaction:282, TransactionAspectSupport (org.springframework.transaction.interceptor)
invoke:96, TransactionInterceptor (org.springframework.transaction.interceptor)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
intercept:673, CglibAopProxy$DynamicAdvisedInterceptor (org.springframework.aop.framework)
addRecentPerson:-1, PersonService$$EnhancerBySpringCGLIB$$372034be (com.blah.portal.services.web.service)
addRecentPerson:49, PersonController (com.blah.portal.services.web.controller)
版本
org.springframework.data:spring-data-commons:1.13.10.RELEASE
org.springframework.data:spring-data-jpa:1.11.10.RELEASE
org.eclipse.persistence:eclipselink:2.7.1
org.eclipse.persistence:javax.persistence:2.1.1
org.eclipse.persistence:org.eclipse.persistence.jpa:2.4.2
org.eclipse.persistence:org.eclipse.persistence.jpa.jpql:2.4.2