使用 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
我想知道如何做出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
提前致謝!
uj5u.com熱心網友回復:
這聽起來更像是你用一個簡單的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,這樣可能性能更好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/347008.html
