% Beğeni% Query in spring JpaRepository


110

İçine benzer bir sorgu yazmak istiyorum JpaRepositoryama hiçbir şey döndürmüyor:

LIKE '%place%'-çalışmıyor.

LIKE 'place' Mükemmel çalışıyor.

İşte kodum:

@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);
}

Yanıtlar:


199

Bahar verileri JPA sorgusu "%" karakterlerinin yanı sıra likesorgunuzda aşağıdaki gibi bir boşluk karakterine ihtiyaç duyar :

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

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

@QueryStandart sorguya benziyor gibi göründüğü için açıklamadan tamamen kurtulmak isteyebilirsiniz (yay veri proxy'leri tarafından otomatik olarak uygulanır); yani tek hattı kullanarak

List<Registration> findByPlaceContaining(String place);

yeterlidir.


23
Bir sorgu için büyük / küçük harf durumunu yok saymak, şunu kullanarak yararlı olabilir: findByPlaceIgnoreCaseContaining (String place);
— ilyailya

Bir yan yorum olarak - aynı sorgu içinde%: param% ile% param% 'ı karıştırıp eşleştiremezsiniz. Aksi takdirde uygulama başlamaz bile.
— RVP

Teşekkür ederim. Önceden like '%:place%'birlikte 'yazıyordum ve hiçbir sonuç yoktu, çünkü Hibernate 'kendi başına dizelere s ekler .
— Yamashiro Rion

Bu iyi bir tepki değildir ve potansiyel olarak da tehlikelidir. Spring, ContainingIgnoreCase ile bunu çözdü, cevabımı aşağıda kontrol edin.
— Alexius DIAKOGIANNIS

99

Aslında @Queryek açıklamaya hiç ihtiyacınız yok .

Sadece aşağıdakileri kullanabilirsiniz

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

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Benim için bu en iyi çözüm. IgnoreCase'i Containing ile birlikte kullanabileceğinizi bilmiyordum, Belgelerde yok.
— Wilson Campusano

1
Pek çok sütun kullanmak istediğimde durum ne olacak? - Zorunlu olduğuna inanıyorum @Query(), değil mi? Bu yaklaşımla or, bunun aslında bu durum için pek de uygun bir çözüm olmadığına findByField1OrField2Containg(String phraseForField1, String phraseForField2)
— karar vermem gerekir

26

Spring Data JPA tarafından desteklenen "İçerir" anahtar sözcüğünü kullanarak benzer sorguları da uygulayabilirsiniz .

List<Registration> findByPlaceContaining(String place);

20

Durumunuz için doğrudan JPA yöntemlerini kullanabilirsiniz. Bu feryat gibidir:

İçeren: seçin ... gibi%: place%

List<Registration> findByPlaceContainingIgnoreCase(String place);

Burada, IgnoreCase , durumu görmezden gelerek öğeyi aramanıza yardımcı olacaktır.

@Query'yi JPQL'de kullanma :

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

İşte bazı ilgili yöntemler:

  1. Sevmek findByPlaceLike

    … X.place nerede? 1

  2. StartingWith findByPlaceStartingWith

    … Burada x.place? 1 gibi (parametre ekli% ile bağlı)

  3. İle bitmek findByPlaceEndingWith

    … Burada x.place gibi? 1 (parametre başına eklenen% ile bağlı)

  4. Kapsamak findByPlaceContaining

    … Burada x.place? 1 gibi (parametre bağlama% olarak sarılmış)

Daha fazla bilgi, bu bağlantıyı görüntüleyin , bu bağlantı ve bunu görüntüleyin

Umarım bu size yardımcı olur :)


6

Yer tutucuları şu şekilde kullanmak için bir alternatifiniz olabilir:

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

4

Bunu dene.

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

Faydalı Kullandığımız eğer something=:placeve another like %:place%sorguda.
— hong4rc

1

işlevi aradığımda kullanıyorum: findByPlaceContaining("%" + place);

veya: findByPlaceContaining(place + "%");

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


1

cevap tam olarak olacak

-> "@Query (" u.categoryName%: input% şeklinde olduğu yerde u Kategorisinden u seçin ")
     Liste findAllByInput (@Param ("input") Dize girişi);

0

Olmadan çözüm @Querybuldum (aslında hangisinin "kabul edildiğini" denedim ama işe yaramadı).

Page<Entity>Bunun yerine geri dönmek zorunda List<Entity>:

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

IgnoreCase bunu başarmak için önemliydi!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.