web-dev-qa-db-ja.com

LIKEを使用したSpring JPA @Query

CrudRepositoryで、ユーザー名が入力パラメーターのようなユーザーのリストを提供できるメソッドを作成しようとしています(最初からだけでなく、それも含まれています)。メソッド"findUserByUsernameLike(@Param("username") String username)"を使用しようとしましたが、Springのドキュメントで説明されているように、このメソッドは "where user.username like ?1"と同じです。ユーザー名に...

メソッドへのクエリを作成しましたが、展開さえしません。

@Repository
public interface UserRepository extends CrudRepository<User, Long> {

@Query("select u from user u where u.username like '%username%'")
List<User> findUserByUsernameLike(@Param("username") String username);
}

誰もこれで私を助けることができますか?

69
Viktoriia

次のアプローチを使用してみてください(私にとってはうまくいきます):

@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')")
List<String> findUsersWithPartOfName(@Param("username") String username);

注意:JPQLのテーブル名は大文字で始める必要があります。

126
Mark

メソッド名からのクエリ作成 を使用して、いくつかのキーワードを説明している表4を確認します。

  1. Likeの使用:select ... like:username

    List<User> findByUsernameLike(String username);
    
  2. StartingWith:select ... like:username%

    List<User> findByUsernameStartingWith(String username);
    
  3. EndingWith:select ... like%:username

    List<User> findByUsernameEndingWith(String username);
    
  4. 含む:select ... like%:username%

    List<User> findByUsernameContaining(String username);
    

探している答えはnumber 4です。 @Queryを使用する必要はありません

104
jmgoyesc

別の方法:代わりにCONCAT関数を使用して、二重パイプを使用できます。:lastname || '%'

@Query("select c from Customer c where c.lastName LIKE :lastname||'%'")
List<Customer> findCustomByLastName( @Param("lastname") String lastName);

どこでも、接頭辞、接尾辞、またはその両方を置くことができます

:lastname ||'%'  
'%' || :lastname  
'%' || :lastname || '%'  
21
remat_br

List<User> findByUsernameContainingIgnoreCase(String username);

ケースの問題を無視するため

7
Yusuf

以下の使いやすい(CONCATまたは||を使用する必要はありません):

@Query("from Service s where s.category.typeAsString like :parent%")
List<Service> findAll(@Param("parent") String parent);

ドキュメント: http://docs.spring.io/spring-data/jpa/docs/current/reference/html .

6
Míra

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

含む:select ... like%:username%

List<User> findByUsernameContainingIgnoreCase(String username);

ここで、IgnoreCaseは、ケースを無視してアイテムを検索するのに役立ちます。

関連する方法を次に示します。

  1. いいねfindByFirstnameLike

    …ここでx.firstnameは?1のようになります

  2. StartingWithfindByFirstnameStartingWith

    …ここで、x.firstnameは?1のようになります(パラメーターが付加された%でバインドされます)

  3. EndingWithfindByFirstnameEndingWith

    …ここで、x.firstnameは?1のようになります(パラメーターの先頭に%が付加されます)

  4. 含むfindByFirstnameContaining

    …ここで、x.firstnameは?1のようになります(パラメーター境界は%でラップされます)

詳細、表示 このリンク および このリンク

これがあなたを助けることを願っています:)

3

この方法は私にとってはうまくいきます(Spring Bootバージョン2.0.1リリースを使用):

@Query("SELECT u.username FROM User u WHERE u.username LIKE %?1%")
List<String> findUsersWithPartOfName(@Param("username") String username);

説明:?1、?2、?3などは、1番目、2番目、3番目のパラメーターなどのプレースホルダーです。この場合、パラメーターは、標準のSQLクエリであるが、単一引用符。

1
Uisleandro
@Query("select u from user u where u.username LIKE :username")
List<User> findUserByUsernameLike(@Param("username") String username);
0
Mannekenpix