Подтвердить что ты не робот

Spring JPA @Query с LIKE

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

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

@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);
}

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

  • Использование Like: select... like: username

    List<User> findByUsernameLike(String username);
    
  • StartingWith: select... like%: имя пользователя

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

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

    List<User> findByUsernameContaining(String username);
    

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

Ответ 3

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

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

Вы можете поместить куда угодно, префикс, суффикс или оба

:lastname ||'%'  
'%' || :lastname  
'%' || :lastname || '%'  

Ответ 4

List<User> findByUsernameContainingIgnoreCase(String username);

чтобы игнорировать проблемы с кодом

Ответ 5

Прост в использовании (не нужно использовать CONCAT или ||):

@Query("from Service s where s.category.typeAsString like :parent%")
List<Service> findAll(@Param("parent") String parent);

Документировано в: http://docs.spring.io/spring-data/jpa/docs/current/reference/html.

Ответ 6

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

Ответ 7

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

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