簡體   English   中英

jOOQ - DefaultRecordMapper - 列表

[英]jOOQ - DefaultRecordMapper - List

DefaultRecordMapper 可以處理列表嗎?

Model 示例(確實使用了 getter/setter):

class Head {
    public Integer id;
    public List<Position> positions;
    ...
}
class Position {
    public Integer id;
    public Integer headId;
    ...
}

我首先用一個簡單的 select 進行了嘗試:

dsl.select()
    .from(HEAD)
    .join(POSITION).onKey()
    .fetchInto(Head.class);

我也嘗試過使用嵌套語法,但沒有奏效:

dsl.select(..., POSITION.ID.as("positions.id"), ...)
    .from(HEAD)
    .join(POSITION).onKey()
    .fetchInto(Head.class);

該列表永遠不會被初始化。 我不確定我是否做錯了什么。 DefaultRecordMapper 可以做到這一點嗎?

我知道 jOOQ 提供了像“intoGroups”這樣的功能。 然而,這意味着我們公司不能使用我們現有的模型。

或者在這種情況下是否需要像 ie ModelMapper 這樣的第三方庫?

首先十分感謝!

嵌套 collections 的推薦方法

jOOQ 中對嵌套 collections 的開箱即用支持是通過 SQL/XML 或 SQL/JSON 實現的,具體取決於在您的 SQL 方言中最有效的方式。 The idea is that you nest collections directly in SQL, serialise the results as XML or JSON, and use JAXB (for XML), or Gson or Jackson (for JSON) behind the scenes to map the document into a hierarchy of Java classes. 只要您的類路徑中有 JAXB、Gson 或 Jackson,所有這些都非常簡單和自動。

您的數據結構的示例:

dsl.select(
      HEAD.ID,
      field(
        select(jsonArrayAgg(jsonObject(
          key("id").value(POSITION.ID),
          key("x").value(POSITION.X), ...
        )))
        .from(POSITIONS)
        .where(POSITIONS.HEAD_ID.eq(HEAD.ID))
      ).as("positions")
    )
    .from(HEAD)
    .fetchInto(Head.class);

此處記錄了更多示例:

請注意, JSON_ARRAYAGG()將空集聚合到NULL中,而不是空[]中。 如果這是一個問題,請使用COALESCE()

其他選項

還有一些第三方可以幫助簡化映射到嵌套 collections 的任務,包括:

或者,在某種程度上,您可以使用 jOOQ 的各種內置方法,包括Result.intoGroups()的許多重載或基於 JDK CollectorResultQuery.collect() ,它們更具可組合性。

這些方法中的大多數僅在一定程度上起作用,因為它們都基於對連接表產生的平面、非規范化結果集進行去重。 將 collections 直接嵌套在 SQL 中對於任意目標模型強大,所以如果你讓它工作,它會工作得更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM