java 在spring jpa原生查询中使用escape char

wko9yo5t  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(171)

我有下面的本地查询,我想转义下划线(_),所以它不会作为一个像搜索文字
PS:这只是查询的一部分,没有全部完成

@RestResource(path = "findLatestEmployeeByNameExactMatch", rel = "findLatestEmployeeByNameExactMatch")
 @Query(value = "select e from Employee e " +
        " WHERE :name IS NULL OR upper(e.name) LIKE upper(:name) " +
        " AND e.latestProject = (select MAX(an.latestProject) from Employee an where upper(an.name) = upper(a.name))")
Employee findEmployeeByName(@Param("name") String name);

字符串
员工表

name     latest_project
John_X   123
John_X   124
John-X   123
John-X   124


当前API在搜索John_X时返回两条记录John_X 124John-X 124,因为_被认为是文字。我想转义下划线,只返回John_X 124
我该怎么做?

y53ybaqx

y53ybaqx1#

LIKE查询不会将左侧解释为LIKE表达式。只有LIKE查询的右侧会被这样解释。因此,您需要更改:name部分,这可以使用default方法轻松完成:

@Query(value = "SELECT e from employee e WHERE :name IS NULL OR upper(e.name) LIKE :name")
Employee findEmployeeByNameEscaped(@Param("name") String name);

default Employee findEmployeeByName(String name){
    return findEmployeeByNameEscaped(name.toUpperCase().replace("_","\\_");
}

字符串
然后,您可以正常使用findEmployeeByName,它将使用正确的参数调用findEmployeeByNameEscaped

更新

因为你不需要(也不想要)LIKE的特性,你应该使用=

@Query(value = "SELECT e from employee e WHERE :name IS NULL OR upper(e.name) = upper(:name)")
Employee findEmployeeByName(@Param("name") String name);


(我在这里使用旧版本的SQL语句,因为我不觉得新版本是有效的,因为SELECT ... WHERE ... FROM ...
这样,您就不需要转义_,因为它将直接比较字符串而不是匹配。

相关问题