Spring-Data-Jpa を使用してリポジトリ インターフェイスを作成しています。@query アノテーションを使用して明示的なクエリを指定すると、null ポインター例外が発生します。クエリに複数の名前付きパラメーターがあり、名前付きパラメーターを使用している場合にのみ発生します。
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
ました。(クエリの 2 番目の名前付きパラメーター) のエントリを検索している間chargingStatus
、NPEは NULL のexisting.hasPosition(binding.position)
まま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>
名前付きパラメーター (:deviceId、:chargingStatus) の代わりに位置パラメーター (?1、?2) を使用すると、クエリが正常に機能することに注意してください。
他の誰かがこの問題を見ましたか?