java - Spring Boot 2.0.0 M7 更新后,@Query 中未读取 SpEL

标签 java spring-boot spring-data-jpa jpql spring-el

我开发了 Spring Boot 2.0.0 M3 应用程序。一切都很好。但更新到 Spring Boot 2.0.0 M7(甚至最近的 Spring Boot 2.0.0 M5)后,我的 @Query 中的 SpEL 不再正确编译。例如

@Query("SELECT m FROM com.mypackage.models.Model m WHERE m.status IN 
(:#{T(com.mypackage.utils.Constants).SPECIAL_STATUSES})")
public List<Model> findModelWithSpecialStatuses();

我得到以下异常

org.springframework.dao.InvalidDataAccessApiUsageException: Unknown parameter name : __$synthetic$__1; nested exception is java.lang.IllegalArgumentException: Unknown parameter name : __$synthetic$__1
Caused by: java.lang.IllegalArgumentException: Unknown parameter name : __$synthetic$__1
at org.hibernate.query.internal.QueryParameterBindingsImpl.getBinding(QueryParameterBindingsImpl.java:208) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:486) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:104) ~[hibernate-core-5.2.12.Final.jar:5.2.12.Final]
at org.springframework.data.jpa.repository.query.QueryParameterSetter$NamedOrIndexedQueryParameterSetter.setParameter(QueryParameterSetter.java:99) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.ParameterBinder.lambda$bind$0(ParameterBinder.java:57) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_131]
at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) ~[na:1.8.0_131]
at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:57) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.doCreateCountQuery(AbstractStringBasedJpaQuery.java:108) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createCountQuery(AbstractJpaQuery.java:228) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$PagedExecution.count(JpaQueryExecution.java:199) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$PagedExecution.lambda$doExecute$0(JpaQueryExecution.java:193) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.repository.support.PageableExecutionUtils.getPage(PageableExecutionUtils.java:62) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$PagedExecution.doExecute(JpaQueryExecution.java:192) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:89) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:127) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:116) ~[spring-data-jpa-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:597) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:580) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.2.RELEASE.jar:5.0.2.RELEASE]
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.2.RELEASE.jar:5.0.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294) ~[spring-tx-5.0.2.RELEASE.jar:5.0.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) ~[spring-tx-5.0.2.RELEASE.jar:5.0.2.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.2.RELEASE.jar:5.0.2.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.0.2.RELEASE.jar:5.0.2.RELEASE]
... 115 common frames omitted

(:#{T(com.mypackage.utils.Constants).SPECIAL_STATUSES}) - 是对象列表

最佳答案

事实证明,较新版本的 Spring Boot 中的 Hibernate 优化了其查询,因此某些参数不再可见。我发现的最快解决方案是简单地在我的 @Query

中检查这些参数是否为 not null

关于java - Spring Boot 2.0.0 M7 更新后,@Query 中未读取 SpEL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48205398/

相关文章:

java - 如何使用 Spring RestOperations 在单元测试中发送 PageRequest 对象?

java - 我的选择排序代码在一个索引上失败

java - 从 eclipse 使用 tomcat 服务器运行 web 项目

java - 发生异常: android. os.NetworkOnMainThreadException

Spring boot 从领事服务器获取属性

java - Spring Data JPA 通过从父实体获取 id 来插入子实体和父实体

hibernate - 如何在 Spring Boot 应用程序中添加非标准化的 sql 函数?

java - 根据 Activity 配置文件从自定义文件加载属性

java - Spring boot JNDI不工作,tomcat无法启动

java - Spring Data 中的自定义方法实现失败并出现属性未找到错误