2012-07-24 9 views
10

Ich habe meine ContactDao wie folgt definiert:Ist es möglich, den @Query-Parametern Platzhalter hinzuzufügen?

public interface ContactDao extends JpaRepository<Contact, Long> { 

    /** 
    * Finds all contacts that the given user has entered where the contact's full name matches {@code name}. 
    * @param userId The current user's LDAP id. 
    * @param name The name to search for. 
    * @return A list of contacts matching the specified criteria. 
    */ 
    @Query(" select c from Form as f" + 
      " inner join f.contacts as c" + 
      " where f.requestorUserId = :userId" + 
      " and lower(c.fullName) like lower(:name)" + 
      " order by lower(c.fullName)") 
    List<Contact> findUserContactsByUserIdAndName(@Param("userId") String userId, @Param("name") String name); 

} 

Die oben funktioniert perfekt, und die SQL erzeugt ist, was ich selbst schreiben würde. Das Problem ist, dass ich dem Parameter :name Umgebungs-Joker hinzufügen möchte. Gibt es einen schönen Weg, dies zu tun? Ich habe mir das Spring Data JPA-Referenzdokument angesehen und kann nichts über Wildtiere und @query finden.

den folgenden Hack funktioniert, aber ist ein bisschen hässlich:

and lower(c.fullName) like '%' || lower(:name) || '%' 

Hat jemand eine bessere Lösung?

Danke, Muel.

+0

Ein etwas off-topic Randnotiz im Falle irgendwelche _Spring Daten_ Autoren sind über .. :) Vielleicht ist diese Art von Funktion (mit Wildcards begrenzt) hinzugefügt werden könnten, um '@ Param'; zB '@Param (Wert =" Name ", WildcardStategy = WildcardStrategy.BOTH)'. Zugegeben, ich habe mir diesen sehr kleinen Gedanken gemacht, also gibt es wahrscheinlich starke Argumente dagegen! – Muel

+0

Ist das wirklich ein Hack? –

Antwort

3

Ich würde auch nennen Sie es nicht ein Hack - es ist die Art und Weise JPQL Syntax für genau diese Probleme definiert ist.

Allerdings gibt es eine Alternative ein CriteriaBuilder/CriteriaQuery verwenden, aber vielleicht finden Sie es noch komplexer (aber Sie bekommen Kompilierung-Typ Sicherheit im Gegenzug).

+0

Ich persönlich bin kein großer Fan der Kriterien-API. Ich finde es komplexer als JPQL und weniger lesbar (obwohl andere hier nicht mit mir übereinstimmen werden!). Während es Typsicherheit für die Kompilierung bietet, garantiert es nicht, dass es zur Laufzeit gut ausgeführt wird. Vor allem bei der Verwendung von Hibernate! Das einzige Mal, dass ich die Kriterien-API sehr nützlich finde, ist die Erstellung benutzerdefinierter Abfragen basierend auf Benutzereingaben (zB ein Suchformular). Danke für die Antwort! – Muel

Verwandte Themen