
рдирдорд╕реНрдХрд╛рд░, рдкрд╛рдардХ!
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 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 рд╕реЗред рдирд┐рдпрдорд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП (рдмреВрдЯ рдХреЗ рдмрд┐рдирд╛) рдФрд░ рд╕рдВрдХрд▓рди рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд┐рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!