春の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.