如何将 DSL.coalesce 与字段列表一起使用?
How to use DSL.coalesce with lists of fields?
使用 Jooq,我试图首先通过 id
从 table 获取,如果没有找到匹配项,然后再次通过 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
我想知道如何制作 firstMatch
和 secondMatch
两个字段列表,而不是两个字段?
我试过了
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
提前致谢!
这听起来更像是简单的 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
编写等效查询,这可能会更好。
使用 Jooq,我试图首先通过 id
从 table 获取,如果没有找到匹配项,然后再次通过 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
我想知道如何制作 firstMatch
和 secondMatch
两个字段列表,而不是两个字段?
我试过了
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
提前致谢!
这听起来更像是简单的 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
编写等效查询,这可能会更好。