2016-05-12 15 views
7

Ich möchte Daten in User-Tabelle nach Name nach Groß- und Kleinschreibung suchen.JPQL wie 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); 

} 

Ich habe einen Fehler: unerwartetes Token:%. Wo soll ich "%" platzieren?

Antwort

21

können Sie die Concat-Operator verwenden:

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

oder mit einem benannten Parameter:

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

(Getestet mit Frühlings-Boot 1.4.3)

0

Sie können wildcard matching verwenden.

zum Beispiel möchte ich Namen wie haha suchen,

@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 ("wählen u aus User u wo niedriger (u.name) wie low (: u_name) ") –

5

Wenn das nur das, was Sie wollen, und Sie sind mit Spring Data JPA Sie nicht brauchen, um eine Abfrage zu schreiben.

List<User> findByNameContainingIgnoreCase(String name); 

Else benötigen Sie das name Attribut mit % wickeln, bevor Sie es an die Methode übergeben (die direkt in der Abfrage setzen wird einfach nicht funktionieren). Oder verwenden Sie keine Abfrage, sondern verwenden Sie zum Erstellen der Abfrage eine Spezifikation oder die Kriterien-API.

+0

Ich möchte eine Lösung für ein allgemeines Problem finden, die Abfrage verwenden. – windupurnomo