web-dev-qa-db-ja.com

大文字と小文字を区別しないJPQL

大文字と小文字を区別しない名前でユーザーテーブルのデータを検索したい。

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

  @Query("select u from User u where lower(u.name) like %lower(?1)%")
  public List<User> findByNameFree(String name);

}

エラーが発生しました:予期しないトークン:%。 「%」はどこに配置すればよいですか?

19
windupurnomo

Concat演算子を使用できます。

@Query("select u from User u where lower(u.name) like lower(concat('%', ?1,'%'))")
public List<User> findByNameFree(String name);

または名前付きパラメーターを使用:

@Query("select u from User u where lower(u.name) like lower(concat('%', :nameToFind,'%'))")
public List<User> findByNameFree(@Param("nameToFind") String name);

(Spring Boot 1.4.3でテスト済み)

51
Wim Deblauwe

それが必要なものだけで、Spring Data JPAを使用している場合、クエリを記述する必要はありません。

List<User> findByNameContainingIgnoreCase(String name);

それ以外の場合は、name属性をメソッドに渡す前に%でラップする必要があります(クエリに直接入れても機能しません)。または、クエリを使用せずに、仕様またはCriteria APIを使用してクエリを作成します。

15
M. Deinum

wildcard matchingを使用できます。

たとえば、hahaのような名前を検索したい、

@Query("select u from User u where lower(u.name) like :u_name")
public List<User> findByNameFree(@Param("u_name") String name);
List<User> users = userDao.findByNameFree("%haha");
0
Nicholas