繁体   English   中英

Spring-Data-Jpa-使用多个命名参数时,空指针异常

[英]Spring-Data-Jpa - Null pointer exception when using more than one named parameters

我正在使用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 (我的查询1名为PARAM),虽然它一直在寻找了入境chargingStatus (我的查询第二名为param),则将给NPE在existing.hasPosition(binding.position)position为NULL(我猜想,命名参数的位置应该为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),则查询工作正常。

有人看到过这个问题吗?

编辑:Spring Data JPA的1.3.4.RELEASE已修复。 即将在Maven Central上市。

这是一个错误。 我可以很容易地重现该问题,并提交了票 观看进度。 通常,如果您遇到了从框架内抛出的异常(尤其是NPE),这些异常没有明确表示配置错误或指向用户代码,请随时在跟踪器中直接创建问题。 感谢您发现这一点!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM