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);
}
Может ли кто-нибудь помочь мне с этим?
Ответы
Ответ 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);
Я пробовал этот код, и он работает.