在CriteriaBuilder中访问类REGEXP_函数

在CriteriaBuilder中访问类REGEXP_函数,regex,oracle,criteria-api,Regex,Oracle,Criteria Api,我有一个多标准表单,正在使用CriteriaBuilder构建sql。对于本地联系人标准,我需要使用类似regexp_的函数,以便在逗号分隔的数字字符串中搜索数字字符串,即在字符串中搜索“234”,例如“123423456789234”,它应该只返回精确匹配的记录,而不是部分匹配的记录 我已经在Oracle中测试了我的类regexp_语法,我使用的模式工作正常,并给出了我期望的结果 下面的java代码使用简单的like工作(只考虑两个标准的简化版本) 但是,如果我将本地联系人标准代码更改为: i

我有一个多标准表单,正在使用CriteriaBuilder构建sql。对于本地联系人标准,我需要使用类似regexp_的函数,以便在逗号分隔的数字字符串中搜索数字字符串,即在字符串中搜索“234”,例如“123423456789234”,它应该只返回精确匹配的记录,而不是部分匹配的记录

我已经在Oracle中测试了我的类regexp_语法,我使用的模式工作正常,并给出了我期望的结果

下面的java代码使用简单的like工作(只考虑两个标准的简化版本)

但是,如果我将本地联系人标准代码更改为:

if (localContactPk != null && localContactPk > 0) {
        Expression<String> regExpr = cb.literal("(^|\\s|\\w)(" + MISNumberUtils.toString(localContactPk) + ")($|\\s|\\w)");
        Expression<String> path = esilvo.get("lcPks");
        Expression<Boolean> regExprLike = cb.function("regexp_like", Boolean.class, path, regExpr);
        Predicate localContact = cb.equal(regExprLike, 1);
        predicates.add(localContact);
    }
我是java和JPA/Hibernate方面的新手,所以如果您能给我一些建议,我将不胜感激。
感谢

Oracle SQL似乎不支持使用布尔参数或返回调用函数,而且REGEXP_LIKE是一个条件,而不是一个函数

为了解决这个问题,我使用了REGEXP_INSTR,并将其注册如下:

public class Oracle10gCustomDialect extends Oracle10gDialect {
public Oracle10gCustomDialect() {
    super();
    registerFunction("regexp_instr", new StandardSQLFunction("regexp_instr", IntegerType.INSTANCE));
并将我的代码更改为

        if (localContactPk != null && localContactPk > 0) {
        Expression<String> regExpr = cb.literal("(^|\\s|\\w)(" + MISNumberUtils.toString(localContactPk) + ")($|\\s|\\w)");
        Expression<String> path = esilvo.get("lcPks");
        Expression<Integer> regExprInstr = cb.function("regexp_instr", Integer.class, path, regExpr);
        Predicate localContact = cb.gt(regExprInstr, 0);

        predicates.add(localContact);}
if(localContactPk!=null&&localContactPk>0){
表达式regExpr=cb.literal((^ |\\s |\\w)(“+misnumbertils.toString(localContactPk)+”($|\\s |\\w)”);
表达式路径=esilvo.get(“lcPks”);
表达式regExprInstr=cb.function(“regexp_instr”,Integer.class,path,regExpr);
谓词localContact=cb.gt(regExprInstr,0);
谓词.add(localContact);}

查询工作正常。

REGEXP\u LIKE
是一个Oracle SQL函数,Hibernate不知道它,也不知道它的一部分。如果要调用它,则需要将其作为本机函数调用(例如,通过原始查询)。
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> 
public class Oracle10gCustomDialect extends Oracle10gDialect {
public Oracle10gCustomDialect() {
    super();
    registerFunction("regexp_instr", new StandardSQLFunction("regexp_instr", IntegerType.INSTANCE));
        if (localContactPk != null && localContactPk > 0) {
        Expression<String> regExpr = cb.literal("(^|\\s|\\w)(" + MISNumberUtils.toString(localContactPk) + ")($|\\s|\\w)");
        Expression<String> path = esilvo.get("lcPks");
        Expression<Integer> regExprInstr = cb.function("regexp_instr", Integer.class, path, regExpr);
        Predicate localContact = cb.gt(regExprInstr, 0);

        predicates.add(localContact);}