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

Posted

技术标签:

【中文标题】如何在 JPA 中使用 CONTAINS 而不是 LIKE 进行选择【英文标题】:How to select using CONTAINS instead of LIKE with JPA 【发布时间】:2021-05-29 00:15:00 【问题描述】:

我正在使用 PostgreSQL 为学校项目开发小型 Java 应用程序。

使用 JDBC 驱动程序,我可以使用 ~ 运算符选择一个字段来充当 CONTAINING,而不是使用 LIKE 连接过滤器。

让我举个例子:

SELECT * FROM USERS WHERE NAME ~ ? ORDER BY NAME

自从我们开始使用 JPA 框架来简化开发以来,我注意到使用 JPA 的相同示例在我使用 ~ 运算符时会引发错误...

抛出错误:

An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing [select u from Users u where u.name ~ ?1 order by u.name]. 
[30, 41] The expression is not a valid conditional expression.

我可以在 google 上找到的所有代码示例都是使用 LIKE 而不是 CONTAINING 制作的。

我的问题是,JPA 在使用 PostgreSQL 时是否支持包含运算符?

一些信息:

JDK 15
Netbeans 12.3
JPA 2.1
PostgreSQL 13.2

【问题讨论】:

【参考方案1】:

您的直觉是正确的,因为jpa 不支持~ 运算符,有关更多信息,您可以查看包含jpa pdf 规范的persistence-2_1 oracle 链接以及所有可用jpa 运算符的列表不包括~ 运算符。 可用的比较运算符如下:=、>、>=、(不等于)、[NOT]BETWEEN、[NOT]LIKE、[NOT]IN、IS[NOT] NULL、IS[NOT]EMPTY、[NOT]MEMBER[OF]、[NOT]EXISTS

【讨论】:

真的很遗憾,contains 使用起来容易多了,可以选择带有空白参数的东西等等,但感谢您的回答! @NickolasDeluca 欢迎您,遗憾的是您只有两种选择:使用一个缺少 jpql 优势的本机查询,或者如果可能的话仅使用这些运算符重写您的原始查询。 无需强调,完全可以重写为使用LIKE,只是不太理想。 @NickolasDeluca 完全同意你的看法。

以上是关于如何在 JPA 中使用 CONTAINS 而不是 LIKE 进行选择的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ Contains(string[]) 而不是 Contains(string)

如何在 <xsl:if test="contains(string, searchedforstring)"> 中使用变量而不是字符串

如何在 JPA 存储库中准确搜索数字而不是使用 LIKE?

如何在 Spring data jpa 中正确使用 findBySomeOtherId 而不是 findById?

如何使用 UUID 字段而不是 JPA 的主键?

使用未处理的异常而不是 Contains()?