java - DSL 选择中的 JOOQ 和 PostgreSQL 类型

标签 java sql postgresql jooq

我对 jOOQ 3.8 有疑问。 所以,我在 PostgreSQL 9.5 中有一个表,类似的东西。

CREATE TABLE my_table(
  id bigserial,
  types my_type[]
)

my_type 是这样的类型

CREATE TYPE my_type AS(
  id smallint,
  something text
)

现在,在 jOOQ 3.8 中我想做类似的事情

dsl.selectDistinct(MY_TABLE.ID)
   .from(MY_TABLE)
   .join(TYPE_TABLE).on(TYPE_TABLE.ID.equal(DSL.any(
       MY_TABLE.TYPES.ID
   ))
   .fetch(MY_TABLE.ID);

显然我执行 MY_TABLE.TYPES.ID 的步骤是错误的。我正在考虑使用 DSL.select(MY_TYPE.ID)... 但显然 my_type 是一种类型,而不是表。

如何使用 jOOQ 访问类型属性?

最佳答案

如何用 PostgreSQL 解决这个问题

我认为没有一种简单的方法可以将 my_type[] 转换为 PostgreSQL 中的 integer[] 类型,提取 my_type.id 用于每个值,以便它可以与 any() 运算符一起使用。

但是您可以使用 UNNEST() 来解决这个限制,就像这样:

SELECT DISTINCT my_table.id
FROM my_table
CROSS JOIN LATERAL unnest(my_table.types)

上面会产生类似的东西

id   types                      id   something
----------------------------------------------
1    {"(1,a)","(2,b)"}          1    a
1    {"(1,a)","(2,b)"}          2    b
2    {"(1,a)","(2,b)","(3,c)"}  1    a
2    {"(1,a)","(2,b)"}          2    b
2    {"(1,a)","(2,b)"}          3    c

现在,您可以再次加入TYPE_TABLE,例如:

SELECT DISTINCT my_table.id
FROM my_table
CROSS JOIN LATERAL unnest(my_table.types) types
INNER JOIN type_table ON type_table.id = types.id

或者,可能表现更好:

SELECT my_table.id
FROM my_table
WHERE EXISTS (
  SELECT 1
  FROM type_table
  JOIN unnest(my_table.types) AS types ON type_table.id = types.id
)

如何用jOOQ解决这个问题

jOOQ 的 unnest 支持目前(从 3.8 版开始)相当简单,即您不会在结果表中获得所有类型信息,这就是为什么您需要进行一些简单的 SQL 混合。但它肯定是可行的!方法如下:

create().select(MY_TABLE.ID)
        .from(MY_TABLE)
        .whereExists(
            selectOne()
            .from(unnest(MY_TABLE.TYPES).as("types", 
                 MY_TYPE.ID.getName(), 
                 MY_TYPE.SOMETHING.getName()
             ))
            .join(TYPE_TABLE)
            .on(TYPE_TABLE.ID.eq(field(name("types", MY_TYPE.ID.getName()), 
                                     MY_TYPE.ID.getDataType())))
        )
        .fetch(MY_TABLE.ID);

关于java - DSL 选择中的 JOOQ 和 PostgreSQL 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604376/

相关文章:

java初始化静态map

java - 捕获 Javamail 异常

c# - Nhibernate DetachedCriteria Left Outer Join 子查询

postgresql - 强制 Liquibase 将 Blob 映射到 PostgreSQL 上的 BYTEA

postgresql - 如何生成没有破折号的uuid

java - 我的 Java 代码引用我的 XML 按钮时出错

java - 碰撞事件

sql - 将时间存储在 24 :00:00 in postgresql? 以上的最佳方法

mysql - SQL - 如何根据条件获取每个值的计数?

sql - 函数返回单个列中的数据,而不是 3 个单独的列