1

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) を使用すると、クエリが正常に機能することに注意してください。

他の誰かがこの問題を見ましたか?

4

1 に答える 1

0

編集: これは、Spring Data JPA の 1.3.4.RELEASE で修正されました。Maven Central ですぐに利用できるようになります。

これはバグです。問題を簡単に再現でき、チケットを提出しました。進行状況を監視します。一般に、フレームワーク内から例外 (特に NPE) がスローされ、構成の誤りやユーザー コードを明示的に示していない場合は、遠慮なくトラッカーで問題を直接作成してください。これを見つけてくれてありがとう!

于 2013-07-23T16:36:09.910 に答える