对于JPA来说,like查询是不友好的,,例如这么查,是查不出来东西的
@Query("select u from user u where u.username like '%username%'")
List<User> findUserByUsernameLike(@Param("username") String username);
@Query("select u from user u where u.username like '%?1%'")
List<User> findUserByUsernameLike(String username);
=。=这个时候可以用CONCAT函数来帮忙,用column like CONCAT(’%’,?1,’%’) 进行拼接。如下
@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')")
List<String> findUsersWithPartOfName(@Param("username") String username);
核心就是mysql的concat函数,CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的mysql函数之一
CONCAT('%',?1,'%')
再这里感谢stackoverflow大神的回答与启示
>>>
https://stackoverflow.com/questions/21456494/spring-jpa-query-with-like
最后,放出一段实战@Query查询
(e.event_title like CONCAT(’%’,?1,’%’) or ?1 is null)
代表不存在则不查询,存在则进行模糊查询
@Query(value = " select * from event e "
+ " where (e.event_title like CONCAT('%',?1,'%') or ?1 is null) "
+ " and (to_days(e.register_time)=to_days(?2) or ?2 is null) "
+ " and e.status = '1' "
+ " order by e.register_time desc limit ?3,?4 ",nativeQuery = true)
List<Event> findAllList(String eventTitle,Timestamp registerTime,Integer pageNumber,Integer pageSize);
MYSQL中可以用contains,再全文索引的的字段中使用 . 感谢**@雪中鱼01** 的补充
@Query(value = " select * from event e "
+ " where (?1 is null or CONTAINS(e.event_title,'?1')) "
+ " and (to_days(e.register_time)=to_days(?2) or ?2 is null) "
+ " and e.status = '1' "
+ " order by e.register_time desc limit ?3,?4 ",nativeQuery = true)
List<Event> findAllList(String eventTitle,Timestamp registerTime,Integer pageNumber,Integer pageSize);
还可以用 find_in_set()
方法,例如:SELECT * FROM users WHERE find_in_set('[email protected]', emails);
Oracle中提供了 instr(strSource,strTarget)
函数,比使用 LIKE %关键字%
的模式效率高很多。
instr函数也有三种情况:
instr条件 | 相当于like什么 |
---|---|
instr(字段,‘关键字’)>0 | 字段like ‘%关键字%’ |
instr(字段,‘关键字’)=1 | 字段like ‘关键字%’ |
instr(字段,‘关键字’)=0 | 字段not like ‘%关键字%’ |
~
表示匹配正则表达式,且区分大小写。~*
表示匹配正则表达式,且不区分大小写。可以通过这两个操作符来实现like和ilike一样的效果,^和$就是正则表达式里的用法,如下:
1.匹配以“张”开头的字符串 : select * from table where name ~ ‘^张’;
2.匹配以“小”结尾的字符串 : select * from table where name ~ ‘小$’;
!~
是~
的否定用法,表示不匹配正则表达式,且区分大小写。!~*
是~*
的否定用法,表示不匹配正则表达式,且不区分大小写。~~
等效于like,~~*
等效于ilike。!~~
等效于not like,!~~*
等效于not ilike。