Java 带有正则表达式的JPQL子字符串

Java 带有正则表达式的JPQL子字符串,java,sql,regex,jpa,jpql,Java,Sql,Regex,Jpa,Jpql,我有一个表文件夹,其中的行如下 id | path 1 | root 2 | root.first 3 | root.second 4 | root.first.child1 5 | root.first.child1.grandchild1 6 | root.first.child2 我必须只获取路径为root.first.child1和root.first.child2的行,而不是root.first.child1.1的行 我可以使用类似子字符串的本机查询来实现

我有一个表文件夹,其中的行如下

id  |  path
1   | root
2   | root.first
3   | root.second
4   | root.first.child1
5   | root.first.child1.grandchild1
6   | root.first.child2
我必须只获取路径为root.first.child1和root.first.child2的行,而不是root.first.child1.1的行 我可以使用类似子字符串的本机查询来实现这一点

select path from folder 
where substring (path from '((root.first\.)[^\.]+)?') is not null;

我正在JPQL中寻找一个等价的查询。JPQL中的子字符串似乎具有索引和长度,但我无法获得是否可以与正则表达式模式一起使用的参考。

似乎没有通用的解决方案,但是您可以在Postgres中创建一个polyfill函数,该函数允许您在两台服务器上使用POSIX正则表达式

CREATE OR REPLACE FUNCTION REGEXP_LIKE (IN input text, IN pattern text, IN flags varchar DEFAULT '')
RETURNS BOOLEAN
IMMUTABLE
COST 0.013
AS $$
BEGIN
    RETURN array_length(regexp_matches(input, pattern, flags), 1) > 0;
END;
$$ LANGUAGE plpgsql;
成本是用实际数据粗略衡量的


有了它,您可以在Oracle和PostgreSQL中使用类似于REGEXP的
REGEXP\u
c
i
m
似乎是他们都同意如何工作的唯一标志。

根据您的数据库,您可能不需要使用子字符串。MySQL有一个基本的正则表达式支持,您可以使用
WHERE path REGEXP'^root\.first\.child[123]$'
,PostgreSQL对区分大小写的POSIX正则表达式使用速记
~
,对不区分大小写的正则表达式使用
~*
,还支持类似于的SQL标准
。只需使用本机并享受较小的性能调整。JPQL有类似的功能,这是最接近的功能。除了使用JPQL“FUNCTION”调用本机SQL函数之外,谢谢,该查询将由postgres和oracle支持,因此使用特定于db的语法对我没有帮助。所以naitve查询是一个选项。我刚刚检查了JPA文档,它们有
子字符串(string,start[,end])
作为子字符串操作。Oracle似乎没有类似于
运算符的标准
,因此您可能应该在每个数据库上使用
CREATE函数
,为PG中的
~和Oracle中的类似的创建一个通用代理。这对两者都是一次性操作。从那时起,它们似乎足以满足您的需求。