如何使用 jOOQ 执行特定查询

Posted

技术标签:

【中文标题】如何使用 jOOQ 执行特定查询【英文标题】:How to execute specific query using jOOQ 【发布时间】:2018-02-10 04:37:04 【问题描述】:

我在使用 PostgreSQL 数据库的项目中使用 jOOQ。在没有特定条件的情况下执行查询没有任何问题,但是如何使用 jOOQ 执行以下查询?

-- missed the top of query
WHERE pow.tags @> ARRAY [?] 
AND pow.tags @> ARRAY [?] 
AND position('access,yes' IN array_to_string(pow.tags, ',')) = 0 
AND city = ?

有时候,我需要用PostGIS函数来执行请求,我必须如何在jOOQ中编写它?

【问题讨论】:

【参考方案1】:

这个谓词的写法如下:

Condition condition =
     POW.TAGS.contains(new String[]  "a", "b", "c" )
.and(POW.TAGS.contains(new String[]  "b", "c", "d" ) // Just assuming some tags here
.and(position("access,yes", arrayToString(POW.TAGS, ",")).eq(zero()))
.and(POW.CITY.eq("city"));

以上答案假设以下静态导入:

import static org.jooq.impl.DSL.*;
import static org.jooq.util.postgres.PostgresDSL.*;

Field.contains() 的可能问题

如果您的TAGS 列的类型为TEXT,而不是VARCHAR,则Field.contains() 存在一个已知问题:

https://github.com/jOOQ/jOOQ/issues/4754

解决方法是使用纯 SQL:

public static Condition myContains(Field<String[]> field, String[] array) 
    return contains("0 @> 1", field, val(array));

【讨论】:

以上是关于如何使用 jOOQ 执行特定查询的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ:如何在选择查询中调用 Sql 用户定义函数

如何查看 jOOQ 在编译时执行的 SQL 语句?

执行前重建查询

SQL 方言如何在 hibernate 和 JOOQ 等框架内部实际工作

如何在使用 jooq 创建查询字符串时转义单引号?

jooq 从表的特定分区中选择