2014-01-30 4 views
30

Я пытаюсь сделать метод в CrudRepository, который сможет дать мне список пользователей, имена пользователей которых являются LIKE входным параметром (не только начинаются, но и содержат его). Я попытался использовать метод "findUserByUsernameLike(@Param("username") String username)", но, как сказано в весенней документации, этот метод равен «where user.username like ?1». Это не хорошо для меня, поскольку я уже сказал, что я пытаюсь получить всех пользователей, чье имя пользователя содержит ...Spring JPA @Query с LIKE

Я написал запрос к методу, но он даже не развертывается.

@Repository 
public interface UserRepository extends CrudRepository<User, Long> { 

@Query("select u from user u where u.username like '%username%'") 
List<User> findUserByUsernameLike(@Param("username") String username); 
} 

Может ли кто-нибудь помочь мне с этим?

+4

Возможно, вы захотите использовать 'contains' для получения преимуществ от индексов, см. Http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/repository-query -keywords.html –

ответ

55

Попробуйте использовать следующий подход (он работает для меня):

@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')") 
List<String> findUsersWithPartOfName(@Param("username") String username); 

Примечания: Имя таблицы в JPQL должно начинаться с заглавной буквой.

+1

или 'WHERE UPPER (u.username) LIKE CONCAT ('%', UPPER (: username), '%')' для поиска без учета регистра –

0
@Query("select u from user u where u.username LIKE :username") 
List<User> findUserByUsernameLike(@Param("username") String username); 
+0

Спасибо, проблема в том, что jpql чувствителен к регистру, теперь он развертывается, но «LIKE» не работает так, как я хочу. Он находит только записи, которые полностью равны входному параметру (не содержат его). – Viktoriia

14

Другой способ: вместо этого CONCAT функция мы можем использовать двойную трубу: : lastname || '%'

@Query("select c from Customer c where c.lastName LIKE :lastname||'%'") 
List<Customer> findCustomByLastName(@Param("lastname") String lastName); 

Вы можете разместить в любом месте, префикс, суффикс или оба

:lastname ||'%' 
'%' || :lastname 
'%' || :lastname || '%' 
+0

Хорошее и сжатое решение. – Burt

47

Использование Query creation from method names, проверьте таблицу 4, где они объясняют некоторые ключевые слова.

  1. Используя как: выберите ... как: имя пользователя

    List<User> findByUsernameLike(String username); 
    
  2. StartingWith: выберите ... как%: имя пользователя

    List<User> findByUsernameStartingWith(String username); 
    
  3. EndingWith: выберите .. . like: имя пользователя%

    List<User> findByUsernameEndingWith(String username); 
    
  4. Содержит: выберите ... как%: имя пользователя%

    List<User> findByUsernameContaining(String username); 
    

Обратите внимание, что ответ, который вы ищете номер 4. Вам не нужно использовать @Query

+1

Удивительно, это должно быть принято Ответ! отличный чувак. – Dev

+0

Да, это правильный ответ. – khartvin

+0

Это действительно полезно, но если я хочу использовать ключевое слово Containing, могу ли я сделать его нечувствительным к регистру? В документации есть что-то о StringMatcher. Кажется, если бы я создал отдельную функцию с ExampleMatcher, она бы сработала, но могу ли я как-то объявить ее в имени метода не писать свою собственную функцию, просто для того, чтобы добавить эту чувствительность к регистру? –

-1
@Query("select b.equipSealRegisterId from EquipSealRegister b where b.sealName like %?1% and b.deleteFlag = '0'") 
    List<String>findBySeal(String sealname); 

Я пробовал этот код, и он работает.

6

List<User> findByUsernameContainingIgnoreCase(String username);

для того, чтобы игнорировать случай вопросы

Смежные вопросы