春のJpaRepositoryでの%Like%クエリ


110

同様のクエリを記述したいのですJpaRepositoryが、何も返されません。

LIKE '%place%'-動いていない。

LIKE 'place' 完璧に動作します。

これが私のコードです:

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

回答:


199

SpringデータのJPAクエリには、次のようlikeに、クエリの後に「%」文字とスペース文字が必要です。

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

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

@Query標準のクエリ(Springデータプロキシによって自動的に実装される)に似ているように思われるため、注釈をすべて削除したい場合があります。つまり、単一の行を使用して

List<Registration> findByPlaceContaining(String place);

十分なものです。


23
次のようにして、クエリの大文字と小文字を無視することも役立ちます。findByPlaceIgnoreCaseContaining(String place);
ilyailya 2016年

サイドコメントと同じように、同じクエリ内で%:param%を%param%と混合して一致させることはできません。そうしないと、アプリは起動しません。
RVP

ありがとうございました。Hibernateが文字列にsを単独で追加するため、以前はlike '%:place%'with 'と書いていて、結果はまったくありませんでした'
山城リオン

これは適切な対応ではなく、潜在的に危険です。SpringはこれをContainingIgnoreCaseで整理しました、以下の私の答えを確認してください。
Alexius DIAKOGIANNIS

99

実際には@Queryアノテーションは必要ありません。

以下を使用することができます

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

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

私にとってこれが最良の解決策です。IgnoreCaseをContainingと組み合わせて使用​​できることを知りませんでした。ドキュメントには記載されていません。
Wilson Campusano 2017年

1
多くの列を使用したい場合はどうなりますか?-私@Query()は必見だと思いますよね?そのアプローチでは私が行う必要がありますor:それは実際にそのような場合に適しソリューションではありませんfindByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

Spring Data JPAでサポートされているキーワード「Containing」を使用して、同様のクエリを実装することもできます。

List<Registration> findByPlaceContaining(String place);

20

あなたのケースでは、直接JPAメソッドを使用できます。それは怒鳴るようなものです:

含む:select ... like%:place%

List<Registration> findByPlaceContainingIgnoreCase(String place);

ここでは、IgnoreCase大文字小文字を区別せずにアイテムを検索するのに役立ちます。

JPQLで@Queryを使用する

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

関連するメソッドは次のとおりです。

  1. お気に入り findByPlaceLike

    …ここで?1のようなx.place

  2. で始まります findByPlaceStartingWith

    …x.place like?1(%が付加されたパラメーターバインド)

  3. EndingWith findByPlaceEndingWith

    …x.place like?1(先頭に%が付加されたパラメータ)

  4. 含む findByPlaceContaining

    …x.place like?1(%でラップされたパラメーターバウンド)

詳細、このリンクこのリンクこれを表示

これがあなたに役立つことを願っています:)


6

次のようにプレースホルダーを使用する1つの方法があります。

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

4

これを試して。

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

クエリで使用するsomething=:placeと役立ちanother like %:place%ます。
hong4rc

1

関数を呼び出すとき、私は次を使用します: findByPlaceContaining("%" + place);

または: findByPlaceContaining(place + "%");

または: findByPlaceContaining("%" + place + "%");


1

答えは正確になります

-> `@Query(" uをカテゴリuから選択します。ここで、u.categoryNameは%:input%のようになります ")
     リストfindAllByInput(@Param( "input")String input);

0

なしで解決策が見つかりました@Query(実際に「受け入れられた」ものを試しましたが、機能しませんでした)。

Page<Entity>代わりに戻る必要がありList<Entity>ます:

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

IgnoreCase これを達成するために一部が重要でした!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.