如何在Spring JPA中使用PostgreSQL的regexp_matches函数编写查询
使用Spring JPA调用PostgreSQL的regexp_matches函数指南
先帮你修正当前代码里的几个关键问题,再给出几种实用的写法:
你当前代码的问题
- 函数名写错了:PostgreSQL的正则匹配提取函数是**
regexp_matches**,不是你写的matches_regexp - 返回类型适配问题:
regexp_matches默认返回text[](文本数组),直接用List<Object>会不好处理,建议用更精准的类型
写法1:直接获取匹配的分组数组
如果需要获取正则匹配到的所有分组结果,可以用List<String[]>来接收返回值,每个数组元素对应一组匹配结果:
@Query(nativeQuery = true, value = "SELECT regexp_matches(t1.name, '^([\\w\\d\\-]*/)*([\\w\\d\\-]+)/?\\s*$') AS t1_name FROM testDb.testTable t1") List<String[]> getRegexMatches();
举个例子,如果t1.name是"foo/bar/",返回的数组会是["foo/", "bar"],对应正则里的两个分组。
写法2:将匹配结果转为字符串
如果不需要分组数组,只想拿到合并后的匹配字符串,可以用PostgreSQL的array_to_string函数转换结果:
@Query(nativeQuery = true, value = "SELECT array_to_string(regexp_matches(t1.name, '^([\\w\\d\\-]*/)*([\\w\\d\\-]+)/?\\s*$'), '') AS t1_name FROM testDb.testTable t1") List<String> getRegexMatchesAsString();
这样上面的例子会直接返回"foo/bar"。
写法3:仅判断是否匹配(更高效)
如果你的需求只是判断字段是否符合正则,不需要提取分组,建议用PostgreSQL的~正则匹配操作符,返回布尔值更直观:
@Query(nativeQuery = true, value = "SELECT (t1.name ~ '^([\\w\\d\\-]*/)*([\\w\\d\\-]+)/?\\s*$') AS is_match FROM testDb.testTable t1") List<Boolean> isNameMatchingRegex();
额外注意事项
- 如果你的实体类已经用
@Table(name = "testTable", schema = "testDb")指定了schema,查询里可以省略testDb.前缀 - 若要全局匹配所有符合规则的子串,可在正则末尾加
g标志:regexp_matches(t1.name, 'your_regex', 'g') - 可以通过索引获取特定分组,比如
(regexp_matches(t1.name, 'your_regex'))[2]直接拿到第二个分组的结果
内容的提问来源于stack exchange,提问作者Mohamed Ali
相关产品推荐
相关产品推荐

