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