java 如何在JPA标准构建器中使用原生数据库操作符(postgres ~)?

bz4sfanl  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(122)

我使用的是JPA 2。0个条件来构建以下查询(简化):

select n from notif n where n.message ~ 'b.*la'

我正在使用postgresql db,我真的需要~操作符,而不是像。是否有类似于CriteriaBuilder的东西。我可以使用的功能?或者,在postgres中是否有~操作符的函数形式,以便我可以使用提到的cb。函数法我只找到了postgresql regexp_matches函数,但它返回的是一个匹配数组,而不是布尔值。
解决方案:由于从criteria API迁移到JPQL是不可能的,所以我最终编写了一个postgres函数:

'CREATE OR REPLACE FUNCTION "regexp_search"(character varying,character varying) RETURNS boolean AS \'select $1 ~ $2;\' LANGUAGE sql;'

用CB呼叫。功能:

Expression<Boolean> regexp_search = cb.function("regexp_search", Boolean.class, message,cb.literal(re));
yqyhoc1h

yqyhoc1h1#

REGEXP或~不是JPQL标准的一部分。您可以使用原生SQL查询。
如果使用EclipseLink,则支持REGEXP,并将在Postgres上工作,
http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/j_regexp.htm#regexp
您还可以使用SQL函数调用JPQL中的任何SQL特定语法,
http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/j_sql.htm#sql

nhhxz33t

nhhxz33t2#

不需要为此定义额外的函数。textregexeq(string, pattern)等同于string ~ pattern

Expression<Boolean> regexp_search = cb.function("textregexeq", Boolean.class, message, cb.literal(re));

相关问题