如何使用 CriteriaBuilder 调用 db 函数
How to use CriteriaBuilder to call db function
我有一个最终可能包含空格的字符串。我想用与 \t、\r、\n 匹配的正则表达式替换这些空格。替换后我想调用 regexp_like (一个 oracle 函数)来匹配一个字段与这个字符串。
我知道可以使用条件生成器调用数据库函数,如 this link
中所述
我不太熟悉 java 中的正则表达式与 oracle 之间的区别,或者如何将它们拼凑在一起(我从未从 criteriabuilder 调用过函数)。这是我在评论中卡住的地方的暂定步骤
// first replace all spaces with regex for \s,\r,\t, value is the original string
value.replaceAll(" +", "[\t\n\r]+")
// build the db function call expression, seems I cant do table.<String>get(field) and cant pass value as a string
Expression<String> regExp = cb.function("regexp_like", String.class, table.<String>get(field), value);
// now create a predicate not sure how
Predicate fieldMatch = cb.equal(...)
这可能吗?
有可能。你只需要做一些小的改变。
扩展您的 Oracle 对话框
public class Oracle10gCustomDialect extends Oracle10gDialect {
public Oracle10gCustomDialect() {
super();
registerFunction("regexp_like", new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN,
"(case when (regexp_like(?1, ?2)) then 1 else 0 end)"));
}
}
然后在您的 application.properties 或休眠属性配置中使用此路径。
那么在你的规范中,需要做这样的事情。
Expression<Boolean> regExprLike = criteriaBuilder.function("regexp_like", Boolean.class, root.get("yourColumn"), criteriaBuilder.literal("<your regexp value>"));
predicates.add(criteriaBuilder.isTrue(regExprLike));
...
仅此而已!
我有一个最终可能包含空格的字符串。我想用与 \t、\r、\n 匹配的正则表达式替换这些空格。替换后我想调用 regexp_like (一个 oracle 函数)来匹配一个字段与这个字符串。
我知道可以使用条件生成器调用数据库函数,如 this link
中所述我不太熟悉 java 中的正则表达式与 oracle 之间的区别,或者如何将它们拼凑在一起(我从未从 criteriabuilder 调用过函数)。这是我在评论中卡住的地方的暂定步骤
// first replace all spaces with regex for \s,\r,\t, value is the original string
value.replaceAll(" +", "[\t\n\r]+")
// build the db function call expression, seems I cant do table.<String>get(field) and cant pass value as a string
Expression<String> regExp = cb.function("regexp_like", String.class, table.<String>get(field), value);
// now create a predicate not sure how
Predicate fieldMatch = cb.equal(...)
这可能吗?
有可能。你只需要做一些小的改变。
扩展您的 Oracle 对话框
public class Oracle10gCustomDialect extends Oracle10gDialect {
public Oracle10gCustomDialect() {
super();
registerFunction("regexp_like", new SQLFunctionTemplate(StandardBasicTypes.BOOLEAN,
"(case when (regexp_like(?1, ?2)) then 1 else 0 end)"));
}
}
然后在您的 application.properties 或休眠属性配置中使用此路径。
那么在你的规范中,需要做这样的事情。
Expression<Boolean> regExprLike = criteriaBuilder.function("regexp_like", Boolean.class, root.get("yourColumn"), criteriaBuilder.literal("<your regexp value>"));
predicates.add(criteriaBuilder.isTrue(regExprLike));
...
仅此而已!