当前位置: 首页 > 知识库问答 >
问题:

使用多个命名参数时出现空指针异常

葛泳
2023-03-14

我正在使用Spring数据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

我确实查找了字符串查询.java的Spring数据,甚至放置了一个调试点来了解导致NPE的原因。我注意到绑定只有关于 deviceStatus 的条目(在我的查询中是第 1 个命名参数),当它查找充电状态的条目(在我的查询中是第 2 个命名参数)时,它在 exist.hasPosition(binding.position) 中给出 NPE,因为位置为 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,: chargingState),查询就可以正常工作。

有人见过这个问题吗?

共有1个答案

卫博
2023-03-14

编辑:此问题已在1.3.4.Spring数据JPA的发布中修复。应该很快就会在梅文中心上市。

这是一个bug。我可以很容易地复制这个问题并提交一张罚单。观察进展。一般来说,如果您遇到框架内抛出的异常(尤其是NPE),而这些异常没有明确表示错误配置或指向用户代码,那么可以在跟踪程序中直接创建问题。谢谢你发现这个!

 类似资料:
  • > 单击 受保护得空onPrepareDialog(int id,Dialog Dialog) 受保护的对话框onCreateDialog(int id) 如果我对timepickerdialog代码做了什么错误,请告诉我。

  • 问题内容: MyClass.java: 编译MyClass.java文件的SimpleCompileTest.java的清单。 SimpleCompileTest.java: 我正在执行SimpleCompileTest类并获取NullPointerException。ToolProvider.getSystemJavaCompiler()返回null。有人可以告诉我代码有什么问题吗 问题答案:

  • 以下是在sun.reflect.nativeMethodAccessorImpl.Invoke0(本机方法)在sun.reflect.nativeMethodAccessorImpl.Invoke(未知源)在sun.reflect.NativeMethodAccessorImpl.Invoke(未知源)在java.lang.Reflect.Method.Invoke(未知源)在com.codena

  • 我试图用Powermock和Mockito编写一个JUnit测试用例。我正在从测试用例下面调用一个方法。此方法从method1调用,而该方法调用Method2。我已经添加了@runwith和@preparefortest注释。 //这是我的测试类: 错误跟踪:

  • 问题内容: 在查询Android日历中的事件之前,我需要检查权限。为此,Android studio警告我在查询之前需要先进行检查。自动生成的代码如下: 尝试运行它时,出现以下错误: 尝试 在空对象引用上调用虚拟方法’int android.content.Context.checkPermission(java.lang.String,int,int)’ 因此很明显,此时某些东西为空,我试图以不