win*_*omo 22 java spring jpa jpql spring-data-jpa
我想在用户表中按名称不区分大小写搜索数据.
@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);
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:意外的令牌:%.我应该在哪里放置'%'?
Wim*_*uwe 57
您可以使用concat运算符:
@Query("select u from User u where lower(u.name) like lower(concat('%', ?1,'%'))")
public List<User> findByNameFree(String name);
Run Code Online (Sandbox Code Playgroud)
或者使用命名参数:
@Query("select u from User u where lower(u.name) like lower(concat('%', :nameToFind,'%'))")
public List<User> findByNameFree(@Param("nameToFind") String name);
Run Code Online (Sandbox Code Playgroud)
(使用Spring Boot 1.4.3测试)
M. *_*num 15
如果这只是您想要的,并且您使用的是Spring Data JPA,则无需编写查询.
List<User> findByNameContainingIgnoreCase(String name);
Run Code Online (Sandbox Code Playgroud)
否则,在将name属性%传递给方法之前,需要将该属性包装起来(直接将它们放入查询中将无法工作).或者,不要使用查询,而是使用规范或Criteria API来创建查询.
小智 8
我使用的是 Spring Boot 2.1.6,您可以使用 Containing、Contains 和 IsContaining 定义查询方法,如下所示:
List<User> findByNameContaining(String name);
List<User> findByNameContains(String name);
List<User> findByNameIsContaining(String name);
Run Code Online (Sandbox Code Playgroud)
不区分大小写:
List<User> findByNameContainingIgnoreCase(String name);
Run Code Online (Sandbox Code Playgroud)
或者你也可以定义如下:
@Query("select u from User u where lower(u.name) like lower(concat('%', :name,'%'))")
public List<User> findByName(@Param("name") String name);
Run Code Online (Sandbox Code Playgroud)
@Param 注释在这里很重要,因为我们使用的是命名参数。
| 归档时间: |
|
| 查看次数: |
23251 次 |
| 最近记录: |