
рдирдорд╕реНрдХрд╛рд░, рдкрд╛рдардХ!
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдкрд░ рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ @Param
рд╕рд╛рде рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдпрд╛ рдЙрдирдХреА рдорджрдж рд╕реЗ :
@Transactional(readOnly = true) public interface UserRepository extends JpaRepository<User, Integer> { @Query("SELECT u FROM User u WHERE LOWER(u.email) = LOWER(:email)") Optional<User> findByEmailIgnoreCase(@Param("email") String email); List<User> findByLastNameContainingIgnoreCase(@Param("lastname") String lastName); }
(рдЬрд╛рджреВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдкреБрд░рд╛рдиреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмрд╛рдж рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЗрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП рдЯреНрд░реЗрд▓ рдСрдл рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреЗрдЯ рдХреНрд▓рд┐рдирд┐рдХ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ )ред
@Param
рдХреЛ @Param
рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╕рдВрдд рдЙрдирдХреЗ рдмрд┐рдирд╛ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред рдореИрдВрдиреЗ рд╕рдВрдХрд▓рди рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рдирд╛рдореЛрдВ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░реЗрдВ рдПрдХ рд╕реМрджрд╛ рдХрд░реЗрдВред
рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖рдХ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдФрд░ рдЬреЗрдбреАрдХреЗ 8 рд╕реЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдмрд┐рд▓реНрд▓реА рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВ:
рдЕрджреНрдпрддрди: @PathVariable
рдФрд░ @RequestParam
рдХреЛ рдЕрднреА рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ value/name
рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдорд┐рд▓рд╛рди рдХреЛ рдЪрд░ рдирд╛рдореЛрдВ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдереА рд╡рд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд╛рдо рдмрджрд▓рдирд╛ ( mail
рдмрдЬрд╛рдп email
):
@Query("SELECT u FROM User u WHERE LOWER(u.email) = LOWER(:email)") Optional<User> findByEmailIgnoreCase(String mail);
рдореБрдЭреЗ рд░рд┐рд╕реЗрдкреНрд╢рди рдФрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдорд┐рд▓рддреА рд╣реИ:
Caused by: java.lang.IllegalStateException: Using named parameters for method public abstract java.util.Optional ru.javaops.bootjava.restaurantvoting.repository.UserRepository.findByEmailIgnoreCase(java.lang.String) but parameter 'Optional[mail]' not found in annotated query 'SELECT u FROM User u WHERE LOWER(u.email) = LOWER(:email)'! at org.springframework.data.jpa.repository.query.JpaQueryMethod.assertParameterNamesInAnnotatedQuery(JpaQueryMethod.java:125) ~[spring-data-jpa-2.1.3.RELEASE.jar:2.1.3.RELEASE]
рдЕрдЧрд▓рд╛, рд╣рдо рдЙрд╕ рдЬрдЧрд╣ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ 2 рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: StandardReflectionParameterNameDiscoverer
рдФрд░ LocalVariableTableParameterNameDiscoverer
ред рдкрд╣рд▓реЗ JDK8 JEP 118 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ : рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рддрдХ рдкрд╣реБрдВрдЪ ред SPR-9643 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрджрд┐ рдкрд╣рд▓реА рд░рдгрдиреАрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ "ASM- рдЖрдзрд╛рд░рд┐рдд рдбреАрдмрдЧ рдкреНрд░рддреАрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред
- рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЬрд╛рд╡рд╛ 8 рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ,
-parameters
рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХреА -parameters
ред рдореИрдВ IDEA рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рддрд╛ рд╣реВрдВ:

рд╣рд╛рдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ ... рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рдорд╛рд╡реЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЪрд▓рд╛рдКрдВ?
рдкрд░рд┐рдгрд╛рдо рд╡рд╣реА рд╣реИ!
рдореИрдВ рдорд╛рд╡реЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдбрд┐рдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реВрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ:
[DEBUG] Goal: org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) ... <parameters default-value="false">true</parameters>
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ maven-compiler-plugin
рдкрд╣рд▓реЗ maven-compiler-plugin
рд╣реА spring-boot-starter-parent
рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ spring-boot
рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЬрдм SPRING INITIALIZR рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╡рд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ ( рдХреЗрд╡рд▓ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдХреЗ рд▓рд┐рдП ) рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд▓рдЧрдЗрди рд╡рд╣рд╛рдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
<plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <parameters>true</parameters> </configuration> </plugin>
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ maven-compiler-plugin
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕ рдЭрдВрдбреЗ рдХреЛ false
рд╕реЗрдЯ false
ред рдЪреЗрдХ - рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЬрдм рд╣рдо рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
Unable to detect parameter names for query method ru.javaops.bootjava.restaurantvoting.repository.UserRepository.findByEmailIgnoreCase! Use @Param or compile with -parameters on JDK 8.
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐:
- рд╣рдорд╛рд░рд╛ рддрд░реНрдХ рд╕рд╣реА рд╣реИ
- рджреВрд╕рд░реА ASM рд░рдгрдиреАрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореБрдЭреЗ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓реА (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВрдиреЗ рдбрд┐рдмрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛)
рдкрд░рд┐рдгрд╛рдо: рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2 рдореЗрдВ -parameters
рдзреНрд╡рдЬ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк spring-boot-starter-parent
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо @Param
рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ @Param
, @Param
, @Param
рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ @PathVariable
ред рдХрдо рдХреЛрдб, рдХрдо рддреНрд░реБрдЯрд┐рдпрд╛рдБред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 1.x рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рди рдзреНрд╡рдЬ рдХреЛ рдЬрдмрд░рди рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдКрдкрд░ рджреЗрдЦреЗрдВред
PS: рдореИрдВрдиреЗ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗ рд▓рд┐рдП JDK 8, JDK 11 рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2.1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
рдЕрджреНрдпрддрди 2: рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ @PathVariable
рдФрд░ @PathVariable
рджреВрд╕рд░рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рджреВрд╕рд░рд╛ LocalVariableTableParameterNameDiscoverer
рд░рдгрдиреАрддрд┐ ASM рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╕реВрдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ bytecode рд╕реЗред рдирд┐рдпрдорд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП (рдмреВрдЯ рдХреЗ рдмрд┐рдирд╛) рдФрд░ рд╕рдВрдХрд▓рди рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд┐рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!