【问题标题】:Spring-Data-Jpa - Null pointer exception when using more than one named parametersSpring-Data-Jpa - 使用多个命名参数时出现空指针异常
【发布时间】:2013-07-10 16:00:34
【问题描述】:

我正在使用 Spring-Data-Jpa 创建我的存储库接口。在使用 @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

我确实查找了 Spring-Data 的 StringQuery.java,甚至放置了一个调试点来了解导致 NPE 的原因。我注意到bindings 只有关于deviceStatus 的条目(我的查询中的第一个命名参数),并且在查找chargingStatus 的条目(我的查询中的第二个命名参数)时,它在existing.hasPosition(binding.position) 中给出了NPE position 为 NULL(我猜想命名参数的位置应为 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),查询可以正常工作。

其他人看到过这个问题吗?

【问题讨论】:

    标签: java spring spring-data-jpa


    【解决方案1】:

    编辑:这已通过 Spring Data JPA 的 1.3.4.RELEASE 修复。应该很快在 Maven Central 中可用。

    这是一个错误。我可以轻松重现该问题并提交a ticket。观察它的进展。一般来说,如果您遇到从框架内抛出的异常(尤其是 NPE),这些异常没有明确表示错误配置或指向用户代码,请随时在跟踪器中直接创建问题。感谢您发现这一点!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2018-12-31
      • 1970-01-01
      • 2020-05-04
      • 2012-09-30
      相关资源
      最近更新 更多