๐ For queries with named parameters you need to use provide names for method parameters
Spring Data JPA์์ ์๋ Entity๋ฅผ ํตํด ์กฐํ๋ฅผ ํ๋ ค๋๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
(email์ ๋ํ ๋ฐ์ดํฐ๋ DB์ ์กด์ฌํฉ๋๋ค.)
import ...
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@ToString
public class ClubMember extends BaseEntity {
@Id
private String email;
@Column
private String password;
@Column
private String name;
@Column
private boolean fromSocial;
}
import ...
public interface ClubMemberRepository extends JpaRepository<ClubMember, String> {
@Query("select m from ClubMember m where m.email = :email and m.fromSocial = :social")
Optional<ClubMember> findByEmail(String email, boolean social);
}
// ํ
์คํธ ์ฝ๋
@Test
void read_ClubMember() {
/* given */
String email = "user95@zerock.org";
/* when */
ClubMember clubMember = clubMemberRepository.findByEmail(email, false)
.orElseThrow(NullPointerException::new);
/* then */
System.out.println(clubMember);
}
Caused by: java.lang.IllegalStateException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.
์น์ ํ๊ฒ๋ ๋ก๊ทธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๊ณ ์์ต๋๋ค.
Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.
- @Param ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ฑฐ๋ (Java 8+์์) -parameters ์ ์ฌ์ฉํ๋ผ๋ ๊ฒ์ ๋๋ค.
@Param: ๋งค๊ฐ๋ณ์์ ๋ค์์ ํตํด ๋ฉ์๋์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฟผ๋ฆฌ์ ๋ฐ์ธ๋ ์ํค๋ ์ด๋ ธํ ์ด์
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด @Param ์ด๋ ธํ ์ด์ ์ ๋งค๊ฐ๋ณ์์ ์ถ๊ฐํด์ ํด๊ฒฐ์ ํ ์ ์์ต๋๋ค.
...
public interface ClubMemberRepository extends JpaRepository<ClubMember, String> {
@Query("select m from ClubMember m where m.email = :email and m.fromSocial = :social")
Optional<ClubMember> findByEmail(@Param("email") String email, @Param("social") boolean social);
}
๐ค ๊ทธ๋ผ ๋ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ธ javac flag -parameters ๋ ๋ฌด์์ ๋ํ๋ด๋ ๊ฑธ๊น์?
๋จผ์ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ถํฐ ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
Preferences(Command + ,) > Build, Execution, Deployment > Compiler > Java Compiler
Additional command line parameters ๋ถ๋ถ์ -parameters ๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๐ง ์ด์ -parameters ๋ผ๋๊ฒ ๋ฌด์จ ์ญํ ์ ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ Spring Data JPA ๊ณต์๋ฌธ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋์์์ต๋๋ค.
As of version 4, Spring fully supports Java 8’s parameter name discovery based on the -parameters compiler flag. By using this flag in your build as an alternative to debug information, you can omit the @Param annotation for named parameters.
(์์ด๋ฅผ ์ ๋ชปํ๊ธฐ์๐ญ) ๋๋ต -parameters compiler flag ๋ฅผ ํตํด @Param ์ด๋
ธํ
์ด์
์ ์๋ตํ ์ ์๋ค๊ณ ํฉ๋๋ค.
์ด์ฌํ ๊ตฌ๊ธ๋ง์ ํด๋ณธ ๊ฒฐ๊ณผ .... stackoverflow ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธ๋ค์ด ์กด์ฌํฉ๋๋ค.
Q)
๋๋ต์ ์ผ๋ก ํด์ํด๋ณด๋ฉด ...
Custom JPQL @Query ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ , @Param ์ด๋ ธํ ์ด์ ์ ๋ช ์ํ์ง ์์๋๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๋ด์ฉ์๋ Java ๋ฒ์ ์ด 8๋ณด๋ค ์์ ๊ฒฝ์ฐ, @Param ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ผ๊ณ ๋์์๋๋ฐ ๋๋ Java 8์ ์ฌ์ฉํ๊ณ ์๋ค.
๋ฌธ์ ๊ฐ ๋ฌด์์ด๋? ๋ผ๊ณ ์ง๋ฌธ์ ๋จ๊ธฐ์ จ๊ณ ,
A)
Java 8์์ ๋ฆฌํ๋ ์ ์ ํตํด ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ ๊ทผํ ์ ์๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ธํด @Param ์ด๋ ธํ ์ด์ ์ด ํ์ํ์ง ์๋๋ฐ, ์คํ๋ง์ด ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์์
JPQL ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ์ถ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ์ด๋ฅผ ์ํด์๋ -parameters flag ๋ฅผ ์ปดํ์ผ๊ณผ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค.
๋ผ๊ณ ํฉ๋๋ค.
๐ง ๋ฐ๋ผ์ ์ ๋ด์ฉ๋ค์ ์์ฝํด๋ณด๋ฉด ...
Java 8๋ถํฐ -parameter flag ์ค์ ์ผ๋ก ๋ฉ์๋ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
@Query("select m from ClubMember m where m.email = :email and m.fromSocial = :social")
Optional<ClubMember> findByEmail(@Param("email") String email, @Param("social") boolean social);
์ฆ, ์ ์ฝ๋์์ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฟผ๋ฆฌ์ ๋ฐ์ธ๋ฉ ํ ๋, @Param ์ด๋ ธํ ์ด์ ์ ์๋ตํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Java์ .class ํ์ผ์ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ์ ์ฅํ์ง ์์ต๋๋ค. (์ ์ฝ๋์์ email, social)
ํน์ .class ํ์ผ์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ ์ฅํ์ฌ Reflection API๊ฐ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ๊ฒ์ํ๋๋ก ํ๊ธฐ ์ํด
javac compiler์ -parameters ์ต์ ์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ์ ํด์ผ Runtime์์ ์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ํ์ ํ ์ ์์ต๋๋ค.
๐ ์ถ๊ฐ ์๋ฃ
-parameters, ๋ฆฌํ๋ ์ ๋ฑ์ ๋ํด ์ถ๊ฐ์ ์ธ ์๋ฃ๊ฐ ์ํ์๋ฉด ์๋ ์ฌ์ดํธ๋ค์ ๋ ์ฝ์ด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค :)
How to compile Java class to include method parameter names?
JEP 118: Access to Parameter Names at Runtime
Obtaining Names of Method Parameters
References
- https://stackoverflow.com/questions/27733892/java-8-spring-data-jpa-parameter-binding
- https://stackoverflow.com/questions/48515309/naming-query-parameters-in-spring-repository/48515494
- https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html
- https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.named-parameters
'Spring > Spring Data JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ์ฐ๊ด๊ด๊ณ ์์์ฑ ์ ์ด(CASCADE) - CascadeType (3) | 2021.06.21 |
---|---|
Spring Data JPA ์ฆ์ ๋ก๋ฉ(Eager Loading) & ์ง์ฐ ๋ก๋ฉ(Lazy Loading) (0) | 2021.06.17 |
๋๊ธ