【问题标题】:How to use DSL.coalesce with lists of fields?如何将 DSL.coalesce 与字段列表一起使用?
【发布时间】:2021-12-17 22:47:11
【问题描述】:

使用 Jooq,我尝试先通过 id 从表中获取,如果未找到匹配项,则再次通过 handle 获取。

我想要返回行的所有字段,而不仅仅是一个。

        Field<?> firstMatch = DSL.select(Tables.MY_TABLE.fields())
                .from(Tables.MY_TABLE.fields())
                .where(Tables.MY_TABLE.ID.eq(id))
                .asfield(); // This is wrong, because it supports only one field, but above we selected Tables.MY_TABLE.fields(), which is plural. 

        Field<?> secondMatch = DSL.select(Tables.MY_TABLE.fields())
                .from(Tables.MY_TABLE.fields())
                .where(Tables.MY_TABLE.HANDLE.eq(handle))
                .asfield(); // Same as above.

dslContext.select(DSL.coalesce(firstMatch, secondMatch))
          .fetchInto(MyClass.class);

由于上述代码中的错误,出现如下错误:

Can only use single-column ResultProviderQuery as a field

我想知道如何制作 firstMatchsecondMatch 两个字段列表,而不是两个字段?

我试过了

        Field<?>[] secondMatch = DSL.select(Tables.MY_TABLE.fields())
                .from(Tables.MY_TABLE.fields())
                .where(Tables.MY_TABLE.HANDLE.eq(handle))
                .fields();

但在包含DSL.coalesce的行出现以下错误

Type interface org.jooq.Field is not supported in dialect DEFAULT

提前致谢!

【问题讨论】:

    标签: java mysql jooq coalesce


    【解决方案1】:

    这听起来更像是用一个简单的OR 做的事情?

    dslContext.selectFrom(MY_TABLE)
              .where(MY_TABLE.ID.eq(id))
              // The ne(id) part might not be required...
              .or(MY_TABLE.ID.ne(id).and(MY_TABLE.HANDLE.eq(handle))
              .fetchInto(MyClass.class);
    

    如果两个结果集应该是完全互斥的,那么你可以这样做:

    dslContext.selectFrom(MY_TABLE)
              .where(MY_TABLE.ID.eq(id))
              .or(MY_TABLE.HANDLE.eq(handle).and(notExists(
                  selectFrom(MY_TABLE).where(MY_TABLE.ID.eq(id))
              )))
              .fetchInto(MyClass.class);
    

    如果在您的数据库产品上,使用 OR 的查询性能不佳,您可以使用 UNION ALL 编写等效查询,这可能会更好。

    【讨论】:

    • 我明白了。这是否意味着DSL.coalesce() 不支持Fields 列表?
    • @powerseed: COALESCE() 没有做你认为它正在做的事情......它接受可变数量的参数,并返回第一个非NULL 值。它不能对元组/行进行操作...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多