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.
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. –