我正在使用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.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)’ 因此很明显,此时某些东西为空,我试图以不