% Like% Abfrage im Frühjahr JpaRepository


110

Ich möchte eine ähnliche Abfrage schreiben JpaRepository aber sie gibt nichts zurück:

LIKE '%place%'-es funktioniert nicht.

LIKE 'place' funktioniert perfekt.

Hier ist mein Code:

@Repository("registerUserRepository")
public interface RegisterUserRepository extendsJpaRepository<Registration,Long> {

    @Query("Select c from Registration c where c.place like :place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}

Antworten:


198

Die JPA-Abfrage für Federdaten benötigt die Zeichen "%" sowie ein Leerzeichen, das likein Ihrer Abfrage wie in folgt

@Query("Select c from Registration c where c.place like %:place%").

Vgl. http://docs.spring.io/spring-data/jpa/docs/current/reference/html .

Möglicherweise möchten Sie die @QueryAnnotation insgesamt entfernen, da sie der Standardabfrage zu ähneln scheint (die automatisch von den Spring Data Proxys implementiert wird). dh mit der einzelnen Zeile

List<Registration> findByPlaceContaining(String place);

ist ausreichend.


23
Es kann auch nützlich sein, Groß- und Kleinschreibung für eine Abfrage zu ignorieren, indem Sie Folgendes verwenden: findByPlaceIgnoreCaseContaining (String place);
Ilyailya

Nur als Nebenkommentar können Sie%: param% nicht mit% param% in derselben Abfrage mischen und abgleichen. Andernfalls wird die App nicht einmal gestartet.
RVP

Danke dir. Früher habe ich zu schreiben like '%:place%'mit 'und es gab keine Ergebnisse überhaupt, weil Hibernate fügt 's in Strings von selbst aus .
Yamashiro Rion

Dies ist keine gute Antwort und möglicherweise auch gefährlich. Spring hat dies mit ContainingIgnoreCase geklärt, überprüfen Sie meine Antwort unten.
Alexius DIAKOGIANNIS

98

Sie brauchen die @QueryAnmerkung überhaupt nicht.

Sie können einfach Folgendes verwenden

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Für mich ist dies die beste Lösung. Ich wusste nicht, dass Sie IgnoreCase in Kombination mit Containing verwenden können. Es ist nicht in der Dokumentation enthalten.
Wilson Campusano

1
Was ist mit dem Fall, wenn ich viele Spalten verwenden möchte? - Ich glaube, das @Query()ist ein Muss, oder? Mit diesem Ansatz müsste ich machen, ordass dies eigentlich keine gut geeignete Lösung für diesen Fall ist:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

Sie können ähnliche Abfragen auch mit dem von Spring Data JPA unterstützten Schlüsselwort "Containing" implementieren .

List<Registration> findByPlaceContaining(String place);

20

Für Ihren Fall können Sie direkt JPA-Methoden verwenden. Das ist wie unten:

Enthält: Wählen Sie ... wie%: Ort%

List<Registration> findByPlaceContainingIgnoreCase(String place);

Hier hilft Ihnen IgnoreCase bei der Suche nach Elementen, wobei der Fall ignoriert wird.

Verwenden von @Query in JPQL :

@Query("Select registration from Registration registration where 
registration.place LIKE  %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);

Hier sind einige verwandte Methoden:

  1. Mögen findByPlaceLike

    … Wo x.place wie? 1

  2. Beginnen mit findByPlaceStartingWith

    … Wo x.place wie? 1 (Parameter mit angehängtem% gebunden)

  3. EndingWith findByPlaceEndingWith

    … Wo x.place wie? 1 (Parameter mit vorangestelltem% gebunden)

  4. Enthält findByPlaceContaining

    … Wo x.place wie? 1 (Parameter in% eingeschlossen)

Weitere Informationen finden Sie unter diesem Link , diesem Link und diesem

Hoffe das wird dir helfen :)


6

Sie können Platzhalter alternativ wie folgt verwenden:

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);

4

Versuche dies.

@Query("Select c from Registration c where c.place like '%'||:place||'%'")

Hilfreich, wenn wir something=:placeund another like %:place%in Abfrage verwenden.
Hong4RC

1

Wenn ich Funktion anrufe, benutze ich: findByPlaceContaining("%" + place);

oder: findByPlaceContaining(place + "%");

oder: findByPlaceContaining("%" + place + "%");


1

Antwort genau wird sein

-> `@Query (" wähle u aus der Kategorie u aus, wobei u.categoryName wie%: input% ")
     List findAllByInput (@Param ("input") String input);

0

Gefundene Lösung ohne @Query(eigentlich habe ich versucht, welche "akzeptiert" wird. Es hat jedoch nicht funktioniert).

Müssen zurückkehren Page<Entity>statt List<Entity>:

public interface EmployeeRepository 
                          extends PagingAndSortingRepository<Employee, Integer> {
    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);
}

IgnoreCase Teil war entscheidend, um dies zu erreichen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.