问题描述
在将Spring Boot从1.x升级到2.2.2之后也得到了以下错误,这也从本质上升级了Hibernate。
对于具有命名参数的查询,您需要使用方法参数的提供名称。使用@Param作为查询方法的参数,或者在Java 8+上使用javac标志-parameters。嵌套异常是java.lang.IllegalStateException:对于具有命名参数的查询,您需要使用提供方法参数的名称。使用@Param作为查询方法的参数,或者在Java 8+上使用javac标志-parameters。
错误跟踪。
org.springframework.dao.InvalidDataAccessApiUsageException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters,or when on Java 8+ use the javac flag -parameters.; nested exception is java.lang.IllegalStateException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters,or when on Java 8+ use the javac flag -parameters.
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:371)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257)
at org.springframework.orm.jpa.AbstractEntityManagerfactorybean.translateExceptionIfPossible(AbstractEntityManagerfactorybean.java:528)
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:186)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at
@Query(value = "select * from DocumentInfo where ClientID=:clientID and siteID=:siteID and processstatus=:processstatus and eXcelProcessstatus=:eXcelProcessstatus order by modifiedDate asc /*#pageable*/ ",countQuery = "select count(*) from DocumentInfo order by DocumentInfoID /*#pageable*/ ",nativeQuery = true)
List<DocumentInfo> findByClientIDAndSiteIDAndProcessstatusAndeXcelProcessstatusOrderByModifiedDateAsc(int clientID,String siteID,String processstatus,String eXcelProcessstatus,Pageable p);
休眠版本:
hibernate-core-5.4.20.Final.jar
可能的解决方法:
我知道通过在方法中的每个参数中添加@Param (name="")
会起作用,但这是我不想要的,因为它在早期版本的hibernate / spring boot中起作用。
即使跟随也很奇怪
@Query(value = "from ExcelColumnMapping where eXcelMapping=:eXcelMapping")
List<ExcelColumnMapping > findByExcelMapping(ExcelMapping eXcelMapping);
我仍未使用本机查询,但仍说请使用@Param,而该版本在未在早期版本的hibernate中指定@Param即可工作。
编辑2
问题似乎出在Spring-data-jpa,而不是休眠/
解决方法
如果您正在使用Maven,请尝试将其添加到pom.xml中的依赖项中。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.0.Final</version>
</dependency>
还要在pom.xml中的properties标记之前添加此代码:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath />
</parent>
别忘了在您的application.properties文件中添加以下语句,以避免出现休眠错误:
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true