% 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);
}
sudeep cv
quelle

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.

Hille
quelle
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);

    }
Alexius DIAKOGIANNIS
quelle
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);
Amanzoor
quelle
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 :)

Md. Sajedul Karim
quelle
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);
Nitin Pawar
quelle
4

Versuche dies.

@Query("Select c from Registration c where c.place like '%'||:place||'%'")
Ashu
quelle
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 + "%");

user9290654
quelle
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);
Sulaymon Hursanov
quelle
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!

nazar_art
quelle