java - Postgres 和 JOOQ 不区分大小写的正则表达式?

标签 java sql jooq

我目前将此代码与 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/

相关文章:

c# - 从 SqlDataReader 命令中选择列值

sql - 使用proc sql将多个不同结构的表堆叠到一张表中

sql - 如何在 DB2 中使用嵌套结构化类型 (UDT)?

java - 如何将 Jooq 源代码生成与 M2E 一起使用?

java - 在不完全重启的情况下在 Eclipse 中重新发布 Tomcat 服务器

java - 获取 SimpleDateFormat 的模式

sql - 查询以获取月 postgresql 中最后记录期间的数量

java - 表格 reshape

java - 如何使用java水平滚动窗口内的滚动条

java.util.并发: calculating primes