大文字と小文字を区別しない名前でユーザーテーブルのデータを検索したい。
@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);
}
エラーが発生しました:予期しないトークン:%。 「%」はどこに配置すればよいですか?
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でテスト済み)
それが必要なものだけで、Spring Data JPAを使用している場合、クエリを記述する必要はありません。
List<User> findByNameContainingIgnoreCase(String name);
それ以外の場合は、name
属性をメソッドに渡す前に%
でラップする必要があります(クエリに直接入れても機能しません)。または、クエリを使用せずに、仕様またはCriteria APIを使用してクエリを作成します。
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");