Java JPA。 SQL 接受 '_' LIKE 错误

Posted

技术标签:

【中文标题】Java JPA。 SQL 接受 \'_\' LIKE 错误【英文标题】:Java JPA. SQL accept '_' wrong with LIKEJava JPA。 SQL 接受 '_' LIKE 错误 【发布时间】:2019-05-02 16:13:30 【问题描述】:

我正在使用 Spring Data JPA Query 从数据库中获取搜索结果。我正在按名称或描述搜索结果(这些是我表中的列)。

List<MyClass> findByNameIgnoreCaseContainingOrDescriptionIgnoreCaseContaining(String name, String description);

当用户尝试搜索包含特殊字符(例如“Book ( _ , # , %, etc.)”)的内容时,就会出现问题。在这种情况下,JPA 使用LIKE 构建 SQL 查询,它接受下划线或其他特殊字符(如 LIKE 模板的一部分)而不是搜索条件。我怎样才能避免这种情况?

附:我正在使用 mysql

【问题讨论】:

【参考方案1】:

我不完全确定它在 spring-data 中是如何工作的,也许有一种更简洁的方法,但是您可以在将这些字符传递给查询之前屏蔽它们。

例如:

String name = name.replace("_", "\\_");
String description = description.replace("_", "\\_");

然后拨打findByNameIgnoreCaseContainingOrDescriptionIgnoreCaseContaining(name, description)

【讨论】:

'%' 可能同样的事情? @LukStorms 看起来像 问题不仅在于下划线,还在于所有特殊字符。当用户键入#、% 和其他时,结果仍然是错误的。在您的回答中,我只保护我的查询不受下划线的影响,但我需要保护它不受任何特殊字符的影响。让我试着用例子来解释它。用户在 UI“书”上的搜索输入字段中键入并获取结果。如果用户在搜索输入字段中键入“Book_”或“Book%”或其他内容,则必须为空结果,因为 db 中没有适当的名称或描述。 @hlibOstapenko 您可以通过在它们之前添加双斜杠以同样的方式屏蔽其他特殊字符。不过,也许有一种更清洁的方法可以解决您的问题。 如果字符串在 LIKE 中使用,那么可能只有 _% 需要转义。 reference。但如果使用INSTR,则不需要。

以上是关于Java JPA。 SQL 接受 '_' LIKE 错误的主要内容,如果未能解决你的问题,请参考以下文章

JPA Sql NativeQuery with SqlResultSetMapping throwing java.sql.SQLException: Column 'formula3_0_' no

如何在 JPA 中使用 CONTAINS 而不是 LIKE 进行选择

通过 Criteria api 在 LIKE 中转义字符

读Java性能权威指南(第2版)笔记06_数据库性能JPA&SpringData

JPA/Criteria API - Like & equal 问题

SQL Server:SQL Like 通配符特殊用法:Escape