2016-06-11 9 views
0

Angenommen, ich implementieren Suchfunktionalität für ein einfaches CMS-Paket (nur ein Beispiel), und möchten Beiträge mit ihren beiden title und content übereinstimmen. Vermutlich würde ich eine Art Post Einheit mit der folgenden zugrunde liegenden Tabellenstruktur haben:Spring Data JPA - Groß-und Kleinschreibung Abfrage mit Mustererkennung

+------------------------------------+ 
|    POST     | 
+---------+--------------+-----------+ 
| post_id | INTEGER  | NOT NULL, | 
| title | VARCHAR(255) | NOT NULL, | 
| content | CLOB   | NOT NULL | 
+---------+--------------+-----------+ 

Als nächstes würde ich verlängern Spring JpaRepository und die Suchmethode über @Query Anmerkung schreiben, so (wieder nur ein Beispiel):

public interface PostRepository extends JpaRepository<Post, Integer> { 

    @Query("SELECT p FROM Post AS p WHERE lower(p.title) LIKE lower(%:searchTerm%)" 
      + " OR lower(p.content) LIKE lower(%:searchTerm%) ORDER BY p.title") 
    List<Post> findBySearchTerm(@Param("searchTerm") String searchTerm); 
} 

das Problem ist, dass Spring (oder vielleicht ist es nur die zugrunde liegenden JPA-Provider, nicht sicher) hat eine harte Zeit, diese Abfrage aufgrund des lower(%:searchTerm%) Ausdruck in der WHERE Klausel Parsen. Ich habe auch andere Variationen dieser Syntax, z.B.%lower(:searchTerm)%, aber bisher scheint keiner zu funktionieren. Hat jemand eine gute (und vorzugsweise saubere) Lösung dafür?

P.S.: Ich würde die Annotation @Query der Konsistenz halber bevorzugen. Ich denke jedoch, andere Lösungen (wie die method name -> query Ableitung von Frühling oder die) sind auch willkommen.

Antwort

2

versuchen, etwas wie folgt aus:

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

Hinweis: Der Tabellenname in JPQL mit einem Großbuchstaben beginnen.

+2

Diese Antwort scheint zu funktionieren, also danke dafür. Sie haben jedoch keine vollständig funktionierende Lösung bereitgestellt (ich habe stattdessen "lower (concat ('%',: searchTerm, '%'))' 'verwendet). Um zukünftigen Lesern willen - refaktorieren Sie Ihre Antwort so, dass sie zu der oben erwähnten Beispiel-Post-Entität passt und fügen Sie die 'lower()' -Funktionen um 'concat()' hinzu. Dann werde ich es akzeptieren. –

2

1) Injizieren searchTerm bereits in Kleinbuchstaben dem Verfahren, und verwenden Sie JPQL ..... lower(COLUMN_NAME) like %:searchTerm%

2) Verwenden Sie Methodennamen mit Syntax folgenden Namens, so dass Sie nicht brauchen % zum JPQL ..... lower(COLUMN_NAME) :searchTerm

zu schaffen
findBySearchTermContainingIgnoreCase(String searchTerm) 
findBySearchTermStartingWithIgnoreCase(String searchTerm) 
+0

Dies sind beide gültige Lösungen, die zweifellos für jemanden nützlich sein werden. Also vielen Dank für das Aufzeigen (besonders gefällt mir der zweite). In diesem Fall bin ich jedoch versucht, die Lösung von @ Dale zu akzeptieren, da sie besser zu meinem aktuellen Ansatz passt ("@ Query" -Anmerkung). –

+0

Diese arbeiten mit @Query. Aber nicht speziell erwähnt, da Sie es auf jeden Fall wollen. – sura2k

+0

Ja, aber ich bevorzuge es nicht, den Namen der Repository-Methode in diesem Fall zu vernachlässigen. Das Projekt, an dem ich arbeite, hat diesbezüglich leider sehr strenge Richtlinien. –

Verwandte Themen