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