【问题标题】:JOOQ and PostgreSQL types in a DSL selectDSL 选择中的 JOOQ 和 PostgreSQL 类型
【发布时间】:2016-09-21 20:29:17
【问题描述】:

我对 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 访问类型属性?

【问题讨论】:

    标签: java sql postgresql jooq


    【解决方案1】:

    如何用 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);
    

    【讨论】:

      猜你喜欢
      • 2019-10-28
      • 2021-10-29
      • 1970-01-01
      • 2017-04-04
      • 2015-03-10
      • 1970-01-01
      • 2017-01-19
      • 2015-08-25
      • 2019-12-13
      相关资源
      最近更新 更多