2016-05-12 15 views
7

Chcę wyszukiwać dane w tabeli użytkownika według wielkości liter nieuwzględniających wielkości liter.JPQL Like Case Insensitive

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

    @Query("select u from User u where lower(u.name) like %lower(?1)%") 
    public List<User> findByNameFree(String name); 

} 

mam błąd: Nieoczekiwany token:%. Gdzie powinienem umieścić "%"?

Odpowiedz

21

Można użyć operatora concat:

@Query("select u from User u where lower(u.name) like lower(concat('%', ?1,'%'))") 
public List<User> findByNameFree(String name); 

lub nazwanego parametru:

@Query("select u from User u where lower(u.name) like lower(concat('%', :nameToFind,'%'))") 
public List<User> findByNameFree(@Param("nameToFind") String name); 

(testowane z wiosennym Boot 1.4.3)

0

Można użyć wildcard matching.

na przykład chcę, aby wyszukać nazwę jak haha,

@Query("select u from User u where lower(u.name) like :u_name") 
public List<User> findByNameFree(@Param("u_name") String name); 
List<User> users = userDao.findByNameFree("%haha"); 
+1

@query ("wybierz u od Użytkownik u, gdzie niższy (nazwa u.u) jak niższy (: nazwa_użytkownika) ") –

5

Jeśli to jest tylko to, co chcesz i używasz Wiosna danych JPA nie trzeba pisać zapytania.

List<User> findByNameContainingIgnoreCase(String name); 

jeszcze trzeba owinąć atrybut name z % przed przekazać je do metody (wprowadzenie tych bezpośrednio w kwerendzie po prostu nie działają). Lub nie używaj zapytania, ale użyj specyfikacji lub API Criteria do utworzenia zapytania.

+0

Chcę znaleźć rozwiązanie dla ogólnego problemu, który używa kwerendy. – windupurnomo