有没有办法将Spring Data配置为在查询搜索字符串中输入时忽略'_'和'%'等字符?
现在,使用Containing关键字来创建查询方法。如果搜索关键字包含 - '_'或'%',则不会将其视为字符'_'或'%'。
如果我希望将这些字符视为“原样”字符,那么该方法是什么 - 不影响查询结果?我正在使用Spring Data JPA(1.7)和Hibernate。
或者逃避是否应该“外部”完成?
答案 0 :(得分:2)
令人难以置信的是,SpringData并不独立于数据库类型。这种库的目的是能够在postgres,oracle,mysql或其他任何东西下运行。在这里处理转义字符,你只需要自己编写HQL,这样就没用了!
他们从2012年5月开始就不关心它:https://jira.spring.io/browse/DATAJPA-216
答案 1 :(得分:0)
据我所知,这些是您的选择
findBySomething
,则查询将转换为something = <param>
。在这种情况下,_
或%
无关紧要findBySomethingLike
,则查询将转换为something like %<param>%
。显然,_
和%
将被应用findBySomethingStartingWith
,则查询将转换为something like %<param>
findBySomethingEndingWith
,则查询将转换为something like <param>%
findBySomethingContaining
,则查询将转换为something like %<param>%
JPQL支持ESCAPE
关键字,可用于指定查询中使用的转义字符(link)
String ejbql = "SELECT i from Item i WHERE i.name LIKE :pattern ESCAPE
:esc";
Query query = em.createQuery(ejbql);
query.setParameter("pattern", "\\\\_%");
query.setParameter("esc", '\\\\');
List result = query.getResultList();
如您所见,setParameter()中使用了两个反斜杠。第一个反斜杠由Java编译器处理,第二个反斜杠由JPQL编译器处理。结果是匹配具有&#39; _&#39;。
的字符串
但是,afaik没有办法以声明方式使用Spring数据,因此您必须使用自定义存储库实现。