2015-01-01 3 views
12

내 @Repository 인터페이스에서 매개 변수 (addressType)가 포함 된 JPQL @Query로 사용자 정의 찾기 메소드를 만들었습니다. Java 8 스프링 데이터 JPA 매개 변수 바인딩

from Address a where a.addressType = :addressType

는 방법에서 나는 매개 변수에 @Param ("인 AddressType")를 지정하지 않았습니다. 그래서 내가 얻고있다

: 매개 변수 바인딩의 이름이 null이거나 비어 있어서는 안된다. 명명 된 매개 변수의 경우이 거의 분명하다 < 8

좋아 자바 버전에 쿼리 메서드 매개 변수에 대한 @Param를 사용해야합니다,하지만 난 그래서 여기에 자바 (8)에 대한 특별한 무엇 자바 (8)을 사용하고?

+0

오, 친애하는, 당신은 생략 한 당신의 JPQL 쿼리에서 이렇게 "는 SELECT" 이제는 불법입니다. –

답변

11

Java 8에서는 리플렉션을 사용하여 메소드 매개 변수의 이름에 액세스 할 수 있습니다. Spring은 메서드 매개 변수의 이름에서 JPQL 매개 변수의 이름을 추론 할 수 있으므로 @Param 주석을 필요로하지 않습니다.

그러나 해당 정보를 사용하려면 컴파일러에 -parameters 플래그를 사용해야합니다.

http://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html을 참조하십시오.

+1

답변 해 주셔서 감사합니다. 하지만 Java8을 사용하고 SpringData는 여전히 @Param 주석을 요구합니다. –

+3

내가 링크 된 페이지에서 설명한대로 -parameters 옵션을 사용하여 클래스를 컴파일 했습니까? –

+0

아니, 그 시도는하지 않았다. 코드가 특별한 컴파일 설정 없이는 작동하지 않기 때문에 @Param 주석을 고수하기로 결정했다. 그러나이 코멘트는 당신이 당신의 주된 대답에서 의미하는 바를 설명합니다. 고맙습니다! –

7

@JB Nizet이 제공 한 대답은 정확하지만 Eclipse를 사용할 때 Java 8 컴파일러에 -parameters 플래그를 추가하는 방법을 지적하고자했습니다. 이 창에 -> 환경 설정 :

enter image description here

메이븐은 또한 치어 자체에 플래그를 추가 할 수 있습니다 :

이 가
<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> 
+0

스프링 데이터를 사용하고 계십니까? – Alex78191