[春季启动迁移到2.3.3] InvalidDataAccessApiUsageException:对于名称为..的查询,您需要使用提供名称使用@Param进行查询

问题描述

在将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