我目前将此代码与 JOOQ 一起使用:
Condition condition = DSL.trueCondition();
if( isNotBlank(email) ){
condition = condition.and(APP_USER.EMAIL.likeRegex(email));
}
这最终会发出 Postgres 特定的 SQL,该 SQL 在数据库中进行正则表达式匹配:
app_user.email ~ '{email regex}'
是否可以让 JOOQ 发出 case insensitive版本:app_user.email ~* '{email regex}'
?
我目前的解决方法是使用这段代码:
if( isNotBlank(email) ){
condition = condition.and(
APP_USER.EMAIL.lower().likeRegex(email.toLowerCase()) );
}
最佳答案
如果 jOOQ API 缺少特定于供应商的功能,答案是 "plain SQL" .在你的情况下,只需这样写:
PostgreSQL 特定的解决方案
Condition condition = DSL.trueCondition();
if( isNotBlank(email) ){
condition = condition.and("{0} ~* {1}", APP_USER.EMAIL, DSL.val(email));
}
方法Condition.and(String, QueryPart...)
只是方便通过 DSL.condition(String, QueryPart...)
创建一个显式的纯 SQL Condition
:
Condition condition = DSL.trueCondition();
if( isNotBlank(email) ){
condition = condition.and(DSL.condition("{0} ~* {1}", APP_USER.EMAIL, DSL.val(email)));
}
与供应商无关的解决方案
如果你想成为供应商不可知论者,你必须将上面的代码包装在你自己的实用程序中并求助于使用 CustomCondition
public static Condition caseInsensitiveLikeRegex(Field<String> field, String regex) {
return new CustomCondition() {
@Override
public void accept(Context<?> ctx) {
if (ctx.family() == POSTGRES)
ctx.visit(DSL.condition("{0} ~* {1}", field, DSL.val(regex));
else
ctx.visit(field.lower().likeRegex(regex.toLowerCase()));
}
}
}
当然,regex.toLowerCase()
调用不是 100% 正确的,因为它对正则表达式内容以及转义模式(例如 \B
用于反斜杠,但你明白了。
关于java - Postgres 和 JOOQ 不区分大小写的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44962787/