Я пытаюсь создать метод в CrudRepository, который сможет предоставить мне список пользователей, чьи имена похожи на входной параметр (не только начинаются с него, но также содержат его). Я пытался использовать метод, "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);
}
Кто-нибудь может мне с этим помочь?
containing
для получения преимуществ от индексов, см. Docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/…Ответы:
Попробуйте использовать следующий подход (у меня он работает):
@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')") List<String> findUsersWithPartOfName(@Param("username") String username);
Примечание. Имя таблицы в JPQL должно начинаться с заглавной буквы.
источник
WHERE UPPER(u.username) LIKE CONCAT('%',UPPER(:username),'%')
выполнить поиск без@Param
продезинфицированы, поэтому нет.Использование Like:
select ... like :username
List<User> findByUsernameLike(String username);
Начиная с:
select ... like :username%
List<User> findByUsernameStartingWith(String username);
EndingWith:
select ... like %:username
List<User> findByUsernameEndingWith(String username);
Содержит:
select ... like %:username%
List<User> findByUsernameContaining(String username);
Обратите внимание, что ответ, который вы ищете, - номер 4 . Вам не обязательно использовать @Query
источник
List<User> findByUsernameContainingIgnoreCase(String username);
StartingWith: select ... like :username%
иEndingWith: select ... like %:username
... в любом случае отличный ответ ... должен быть принятым. Спасибо.Другой способ: вместо
CONCAT
функции мы можем использовать двойной канал :: lastname || '%'@Query("select c from Customer c where c.lastName LIKE :lastname||'%'") List<Customer> findCustomByLastName( @Param("lastname") String lastName);
Вы можете указать где угодно, префикс, суффикс или оба
:lastname ||'%' '%' || :lastname '%' || :lastname || '%'
источник
List<User> findByUsernameContainingIgnoreCase(String username);
чтобы игнорировать проблемы с регистром
источник
В вашем случае вы можете напрямую использовать методы JPA. Это похоже на ниже:
Содержит: select ... например%: username%
List<User> findByUsernameContainingIgnoreCase(String username);
здесь IgnoreCase поможет вам искать элемент без учета регистра.
Вот несколько связанных методов:
подобно
findByFirstnameLike
… Где x.firstname like? 1
Начиная с
findByFirstnameStartingWith
… Где x.firstname как? 1 (параметр связан с добавленным%)
EndingWith
findByFirstnameEndingWith
… Где x.firstname как? 1 (параметр связан с добавлением%)
Содержащий
findByFirstnameContaining
… Где x.firstname как? 1 (привязка параметра заключена в%)
Дополнительная информация, просмотрите эту ссылку и эту ссылку
Надеюсь, что это поможет вам :)
источник
Легко использовать следующее (не нужно использовать 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 .
источник
Этот способ работает для меня (с использованием Spring Boot версии 2.0.1. RELEASE):
@Query("SELECT u.username FROM User u WHERE u.username LIKE %?1%") List<String> findUsersWithPartOfName(@Param("username") String username);
Объяснение:? 1,? 2,? 3 и т. Д. Являются заполнителями первого, второго, третьего параметров и т. Д. В этом случае достаточно, чтобы параметр был окружен%, как если бы это был стандартный запрос SQL, но без одинарные кавычки.
источник
@Query("SELECT u.username FROM User u WHERE u.username LIKE %:username%")
@Query("select u from user u where u.username LIKE :username") List<User> findUserByUsernameLike(@Param("username") String username);
источник
@Query("select b.equipSealRegisterId from EquipSealRegister b where b.sealName like %?1% and b.deleteFlag = '0'" ) List<String>findBySeal(String sealname);
Я пробовал этот код, и он работает.
источник