我正在使用 Spring-Data-Jpa 创建我的存储库接口(interface)。在使用 @query 注释指定显式查询时,我看到空指针异常。仅当我在查询中有多个命名参数且仅当我使用命名参数时才会发生这种情况。
public interface DeviceStatusRepository extends JpaRepository<DeviceStatus, Long>, JpaSpecificationExecutor<DeviceStatus> {
@Query(value = "SELECT ds from DeviceStatus ds where ds.deviceId like :deviceId and ds.chargingStatus like :chargingStatus")
Page<DeviceStatus> searchByMultipleFields(@Param("deviceId") String deviceId, @Param("chargingStatus") String chargingStatus, Pageable p);
}
以下是空指针异常:
Caused by: java.lang.NullPointerException
at org.springframework.data.jpa.repository.query.StringQuery.checkAndRegister(StringQuery.java:175)
at org.springframework.data.jpa.repository.query.StringQuery.parseLikeBindings(StringQuery.java:162)
at org.springframework.data.jpa.repository.query.StringQuery.<init>(StringQuery.java:68)
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:53)
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.fromQueryAnnotation(SimpleJpaQuery.java:167)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:114)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:160)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:279)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:147)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:153)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:43)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
... 36 more
我确实查过 StringQuery.java Spring-Data 甚至放置了一个调试点来了解导致 NPE 的原因。我注意到 bindings
只有关于 deviceStatus
的条目(我的查询中的第一个命名参数),而它正在查找 chargingStatus
的条目(第二个查询中的命名参数),它在 existing.hasPosition(binding.position)
中给出 NPE,因为 position
为 NULL(我猜对于命名参数,position 预计为 null) 。看起来像一个错误,因为它没有正确处理空参数。
private final void checkAndRegister(LikeBinding binding) {
for (LikeBinding existing : bindings) {
if (existing.hasName(binding.name) || existing.hasPosition(binding.position)) {
Assert.isTrue(existing.equals(binding), String.format(MESSAGE, existing, binding));
}
}
this.bindings.add(binding);
}
我使用的Spring-Data-Version是1.4.0.M1
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.4.0.M1</version>
</dependency>
请注意,如果我使用位置参数 (?1, ?2) 而不是命名参数 (:deviceId, :chargingStatus),则查询工作正常。
还有其他人遇到过这个问题吗?
最佳答案
编辑:Spring Data JPA 1.3.4.RELEASE 已修复此问题。应该很快就会在 Maven Central 中提供。
这是一个错误。我可以轻松重现该问题并提交 a ticket 。观察它的进展。一般来说,如果您遇到从框架内抛出的异常(尤其是 NPE),这些异常没有明确表达错误配置或指向用户代码,请随时直接在跟踪器中创建问题。感谢您发现这一点!
关于java - Spring-Data-Jpa - 使用多个命名参数时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17575478/