web-dev-qa-db-ja.com

Java 8 Spring DataJPAパラメーターバインディング

@Repositoryインターフェースで、パラメーター(addressType)を含むJPQL @ Queryを使用してカスタム検索メソッドを作成しました。

from Address a where a.addressType = :addressType

このメソッドでは、パラメーターに@Param( "addressType")を指定しませんでした。だから私は得ています

Java.lang.IllegalArgumentException:パラメータバインディングの名前はnullまたは空であってはなりません!名前付きパラメーターの場合、Javaバージョン<8のクエリメソッドパラメーターに@Paramを使用する必要があります。

さて、これはかなり明確ですが、私はJava 8を使用しています。では、ここでJava 8の何が特別なのですか?

15

Java 8では、リフレクションを使用してメソッドのパラメーターの名前にアクセスできます。これにより、SpringはJPQLパラメーターの名前をの名前から推測できるため、@Paramアノテーションが不要になります。メソッドパラメータ。

ただし、その情報を利用できるようにするには、コンパイラで-parametersフラグを使用する必要があります。

http://docs.Oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html を参照してください。

11
JB Nizet

@JB Nizetの答えは正しいですが、Eclipseを使用するときにJava 8コンパイラーに-parametersフラグを追加する方法を指摘したかっただけです。これはWindowにあります。 ->設定:

enter image description here

Mavenでは、pom自体にフラグを追加することもできます。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        <compilerArgs>
            <arg>-verbose</arg>
            <arg>-parameters</arg>
        </compilerArgs>
    </configuration>
</plugin>
9
Xtreme Biker