查询弹簧数据中的'_'或'%'作为被搜索字符串的一部分?

时间:2015-02-19 12:50:34

标签: spring hibernate jpa spring-data spring-data-jpa

有没有办法将Spring Data配置为在查询搜索字符串中输入时忽略'_'和'%'等字符?

现在,使用Containing关键字来创建查询方法。如果搜索关键字包含 - '_'或'%',则不会将其视为字符'_'或'%'。

如果我希望将这些字符视为“原样”字符,那么该方法是什么 - 不影响查询结果?我正在使用Spring Data JPA(1.7)和Hibernate。

或者逃避是否应该“外部”完成?

2 个答案:

答案 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>%

Related JIRA issue

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数据,因此您必须使用自定义存储库实现。