通过 Criteria api 在 LIKE 中转义字符

Kip*_*fer 2 java jpa derby criteria-api

我正在尝试允许来自 Web 前端的用户搜索数据库中的某些属性。属性名称可能包含like 中使用的特殊SQL 字符% 和_。有没有办法转义特殊字符?

我在 Glassfish 5.1、Apache Derby、JPA 2.1 和 EclipseLink 2.7.4 中使用 Criteria API。

其他数据库使用 \ 作为默认转义字符,但 Derby 不使用。从阅读来看,似乎严格的标准要求没有隐式转义字符。

我将用这个数据来说明:

ID           SETNAME             DESCRIPTION                                         
----------------------------------------------
1            Set_1               The very first set
2            Set%2               The second set
Run Code Online (Sandbox Code Playgroud)

和 SQL 通过 JDBC 直接到 Derby。这些表是从以下实体生成的。

SELECT * FROM ATTRIBUTESETMETA WHERE SETNAME LIKE 'Set%2'
Run Code Online (Sandbox Code Playgroud)

如您所料,返回两行(% = 通配符)。

我希望在 Criteria API 中复制以下内容

SELECT * FROM ATTRIBUTESETMETA WHERE SETNAME LIKE 'Set\%2' ESCAPE '\'
Run Code Online (Sandbox Code Playgroud)

它只返回第一行,因为 \ 被显式设置为转义字符。

如果我使用

SELECT * FROM ATTRIBUTEMETA WHERE SETNAME LIKE 'Set\%2'
Run Code Online (Sandbox Code Playgroud)

没有转义子句,我什么也得不到(与其他数据库不同)

这是实体类和一个用于执行标准 api 查询的包装器。

ID           SETNAME             DESCRIPTION                                         
----------------------------------------------
1            Set_1               The very first set
2            Set%2               The second set
Run Code Online (Sandbox Code Playgroud)
SELECT * FROM ATTRIBUTESETMETA WHERE SETNAME LIKE 'Set%2'
Run Code Online (Sandbox Code Playgroud)

该代码相当于我的第一个 SQL 查询并返回相同的结果。

有什么方法可以更改代码以使其表现得像我的第二个查询?(双关语)

M. *_*rov 7

在 JPA 中,CriteriaBuilderlike方法有几个重载,它们有第三个参数,即转义字符。它可以是类型charExpression<Character>.

因此,对于您的情况,最简单的方法是这样:

cb.like(set.get(AttributeSetMeta_.setName), name, '\\')
Run Code Online (Sandbox Code Playgroud)

相关API参考: