Что означает эта строка знаков в jpql?

#java #jpql

#java #jpql

Вопрос:

 @Query("Select u.email from User u where u.email= ?#{[0]}")
Optional<String> getEmail(String email);
  

мой вопрос в том, что это ?#{[0]} значит, я знаю, что запрос должен возвращать электронное письмо, но что означает эта строка знаков?

Ответ №1:

Это поддержка SpEL в jpql. ?#{[0]} означает индексированный доступ к параметрам метода вместо использования именованного доступа. Таким образом, он представляет параметр электронной почты, который передается вашему методу getEmail: параметр с индексом 0, другими словами, ваш первый параметр, если ваша сигнатура метода была, например

Необязательно getServiceEmail(строка email, int OfficeId);

Вы могли бы получить доступ ко второму параметру, используя ?#{[1]} со следующим

 @Query("Select u.email from User u where u.email= ?#{[0]} and u.officeId=?#{[1]} ")
Optional<String> getServiceEmail(String email, int officeId);
  

. Другим способом получения того же результата было бы использовать именованный доступ через метод @Param

 @Query("Select u.email from User u where u.email= :#{#email}")
Optional<String> getEmail(@Param("email") String email);
  

Таким образом, вы можете использовать тот или иной подход

Комментарии:

1. Разве это не то же @Query("Select u.email from User u where u.email= ?0") самое, что и и @Query("Select u.email from User u where u.email= :email) ?

2. @Dimasan, да, это дает тот же результат. Часто существует много способов «скинуть» код cat 🙂