如何在 Spring Data Repository Method 中使用 Regex 关键字

Posted

技术标签:

【中文标题】如何在 Spring Data Repository Method 中使用 Regex 关键字【英文标题】:How to use Regex keyword in Spring Data Repository Method 【发布时间】:2017-11-28 00:28:52 【问题描述】:

我目前使用的是spring-data-jpa版本1.9.4

我有一个 mysql 表,其中包含 project(integer)、summary(varchar) 和 description(varchar) 列。

我有一个正则表达式,我想用它来搜索摘要和/或描述字段,这意味着如果它在摘要中找到它,则不需要将正则表达式应用于描述。

我尝试使用的存储库方法是:

List<Issue> findByProjectAndSummaryOrDescriptionRegex(long project, String regex)

我收到的错误是:

java.lang.IllegalArgumentException:不支持的关键字 REGEX (1): [MatchesRegex,匹配,正则表达式]

在我的公司环境中更新/升级版本很困难,所以如果问题不是我的语法,而是如果有人知道哪个版本现在支持“正则表达式”进行查询派生,或者我可以在哪里找到我的特定信息将感激不尽。我查看了Changelog,似乎1.9.4 应该支持,但似乎不支持。

感谢您的帮助!

京东

编辑 1:我知道 @Query 注释,但我的负责人要求我仅在找不到支持关键字 REGEX [MatchesRegex, Matches, Regex] 的正确版本时才使用它作为最后的手段

【问题讨论】:

鉴于 Regex 已经在 1.3.0 (docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/…) 的文档中列出,因此 spring-data-jpa 的版本可能不是这里的问题 我认为问题在于您的条件不明确(您是右分组还是左分组?),目前尚不清楚您是否希望正则表达式仅适用于 descriptionsummary .这已经够复杂了,我觉得最好明确地写出 JPQL。 @Chrylis 感谢您的回复!暂时我打算走那条路并研究这个问题。令我困扰的是,文档表明一件事,而不是另一件事。 【参考方案1】:

如果 Spring 数据语法不起作用,我建议使用本机查询(带有 @Query 注释),例如:

@Query(nativeQuery=true, value="SELECT * FROM table WHERE project = ?1 AND (summary regexp ?2 OR description regexp ?2)")
List<Issue> findByProjectAndSummaryOrDescription(long project, String regex);

更新

如果本机查询不是一个选项,那么 (a) 您可以尝试使用单列并查看是否有效,并且 (b) 您可以尝试通过将 regex 附加到两列来尝试,例如:

List<Issue> findByProjectAndDescriptionRegex(long project, String regex);

List<Issue> findByProjectAndSummaryRegexOrDescriptionRegex(long project, String regex, String regex);

【讨论】:

我相信SummaryRegexOrDescriptionRegex 暗示了两个字符串参数 我为您建议的每个示例更新、编译并运行了代码,但仍然收到 IllegalArgumentException for Unsupported keyword REGEX。当我查看关键字时,[link]docs.spring.io/spring-data/jpa/docs/1.9.4.RELEASE/reference/… 表示应该允许 Regex。 @crizzis - 即使使用 Darshan 建议的单个示例也会引发相同的错误,'findByProjectAndDescriptionRegex(long project, String regex)。所以我不确定 arg 是不是此时的问题。 原始示例 findByProjectAndSummaryOrDescriptionRegex 也暗示了两个字符串参数 (AND summary= ? OR description REGEXP ?) Darshan Mehta 和@crizzis,感谢你们今天的时间和帮助。我将继续使用本机查询作为占位符,因为我还没有找到关于哪个版本实际支持关键字的有据可查的分界线,即使链接的文档表明它是。我希望你们俩周六过得愉快!【参考方案2】:

在后续工作中,我通过挖掘发现权威列表将驻留在 org.springframework.data.jpa.repository.query.JpaQueryCreator 类中。因此,对于想知道“已记录”列表中哪些关键字已实际实现的未来人们,请查看 JpaQueryCreator 内部,您将在开关内将支持的关键字作为大小写参数!

希望这会有所帮助!

PS - 我的版本不支持正则表达式

【讨论】:

【参考方案3】:

尝试使用 @Query with param nativeQuery = true 在里面你可以使用数据库 regexp_like 函数:

@Query(value = "select t.* from TABLE_NAME t where regexp_like(t.column, ?1)", nativeQuery = true)

文档: https://www.techonthenet.com/oracle/regexp_like.php

【讨论】:

以上是关于如何在 Spring Data Repository Method 中使用 Regex 关键字的主要内容,如果未能解决你的问题,请参考以下文章

spring config server- 用于本地 git 存储库

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

如何在 Spring Boot 应用程序的同一个域类上同时使用 Spring Data JPA 和 Spring Data Elasticsearch 存储库?

如何在 Spring-Data-Rest 中实现细粒度的访问控制?

如何在 Spring Data 存储库上测试 Spring 的声明式缓存支持?

更新Alpine Linux源 sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositor