SpringDataJPA之@Query with LIKE(JPA模糊查询)

对于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

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('aa@email.com', emails);

oracle:instr

Oracle中提供了 instr(strSource,strTarget) 函数,比使用 LIKE %关键字% 的模式效率高很多。

instr函数也有三种情况:

instr条件相当于like什么
instr(字段,‘关键字’)>0字段like ‘%关键字%’
instr(字段,‘关键字’)=1字段like ‘关键字%’
instr(字段,‘关键字’)=0字段not like ‘%关键字%’

pgsql:~~用法

  • ~ 表示匹配正则表达式,且区分大小写。
  • ~* 表示匹配正则表达式,且不区分大小写。

可以通过这两个操作符来实现like和ilike一样的效果,^和$就是正则表达式里的用法,如下:

1.匹配以“张”开头的字符串 : select * from table where name ~ ‘^张’;

2.匹配以“小”结尾的字符串 : select * from table where name ~ ‘小$’;

  • !~~的否定用法,表示不匹配正则表达式,且区分大小写。
  • !~*~*的否定用法,表示不匹配正则表达式,且不区分大小写。
  • ~~等效于like,~~*等效于ilike。
  • !~~等效于not like,!~~*等效于not ilike。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值