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函数也有三种情况:
在这里插入图片描述

pgsql:~~用法

~ 表示匹配正则表达式,且区分大小写。
~* 表示匹配正则表达式,且不区分大小写。
可以通过这两个操作符来实现like和ilike一样的效果,^和$就是正则表达式里的用法,如下:

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

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

!~ 是~的否定用法,表示不匹配正则表达式,且区分大小写。
!~* 是~*的否定用法,表示不匹配正则表达式,且不区分大小写。
等效于like,*等效于ilike。
!~~ 等效于not like,!~~*等效于not ilike。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值