Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过在postgresql的where查询中传递%来筛选数据_Java_Postgresql - Fatal编程技术网

Java 通过在postgresql的where查询中传递%来筛选数据

Java 通过在postgresql的where查询中传递%来筛选数据,java,postgresql,Java,Postgresql,我需要根据搜索框中的输入搜索数据。 为了处理这个问题,我编写了如下查询 SELECT distinct d.desktop_id as desktopId, d.name as desktopName from desktoptable where d.name ilike '%'+searchString+'%' searchString:nothing是我传递给查询的输入。这个查询在所有其他输入字符串(除了%和u)中都能正常工作,我在postgres文档中读

我需要根据搜索框中的输入搜索数据。 为了处理这个问题,我编写了如下查询

SELECT distinct d.desktop_id as desktopId,
                d.name as desktopName
from desktoptable
where d.name
ilike '%'+searchString+'%'
searchString:nothing是我传递给查询的输入。这个查询在所有其他输入字符串(除了%和u)中都能正常工作,我在postgres文档中读到“u和%分别作为通配符表示任何单个字符和任何字符串”

这意味着我可以将%或uu作为输入传递给查询以过滤数据。在我的数据库中,有些记录也有%和u


有人能告诉我如何解决这个问题吗。

很可能您的全局
ILIKE
搜索没有像Postgres上运行的实际SQL查询那样连接。出于这个原因,也为了避免SQL注入之类的事情,您应该在Java中使用准备好的语句。像这样的方法应该会奏效:

String query = "SELECT distinct d.desktop_id as desktopId, d.name as desktopName ";
       query += "from desktoptable where d.name ilike ?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, "%" + handle(searchString) + "%");
这里的
handle()
是一种方法,它将特别转义通配符和下划线,以便在
LIKE
操作符中使用。AFAIK准备的语句不会自动执行此操作

public String handle (String input) {
    return input.replaceAll("%", "\\%")
                .replaceAll("_", "\\_");
}

我在Postgres上测试了这一点,一个反斜杠似乎就足以转义像特殊字符一样的

你的建议是对的,但我想加上OP想要转义搜索字符串中的%.@YeWin我不这么认为,不是从我看到的。似乎他想进行通配符搜索,在这种情况下,
%
不应以任何方式转义。因此,如果他在查询中输入像%\uu这样的参数,您的查询将被删除“我喜欢%aa%\uu%。因为他想将%或u作为输入传递给查询以筛选data@YeWin我现在明白你的意思了。我认为在这种情况下,我们需要手动转义通配符和下划线。很抱歉,如果有任何混淆,我在db中有一些记录具有特殊字符,如%、,$等。我的要求是获取名称中具有特殊字符%或u的所有桌面。我希望这能让问题变得不那么清楚