【问题标题】:JOOQ - How i can fetch data into pojo with a field listJOOQ - 我如何使用字段列表将数据提取到 pojo
【发布时间】:2018-08-29 13:48:57
【问题描述】:

我有一个包含三个表的 DDBB:loan、person 和 loan_person_rel 以及每个表的相应 POJO。

贷款

private int line;
private Double balance;
private Double expired;
private int state;
private int defaultDays;
private Branch branch;
private String balanceHistory;
private String expiredHistory;
private Long loanCode;
private List<Person> persons;
private String extraInfo;
private LoanTypes loanType;
private String nomPro;
//The class contains the getters and setters :)

private String name;
private String documentNumber;
private String workEnterprise;
private String workCity;
private String workAddress;
private String workNeighborhood;
private String workPhone;
private String occupation;
private String homePhone;
private String cellPhone;
private String phone3;
private String phone4;
private String homeAddress;
private String homeCity;
private String homeNeighborhood;
private String email;
private String relationship;
private List<Loan> loans;
//The class contains the getters and setters :)

Loan_person_rel

private String personId;
private String loanId;
private int type;
//The class contains the getters and setters :)

我如何构建一个 JOOQ 选择或某种方法来检索数据并使用填充的字段 persons 填充类贷款?

【问题讨论】:

  • 您在这里提出的问题看起来您需要一个成熟的 ORM 解决方案,而不是 JOOQ。 JOOQ 是比较简单的 SQL 映射器/生成器库,不是模型图查询工具。或者至少这一直是我的印象。
  • 如果出于某种原因你真的不能使用基于 JPA 的实体图持久性框架,你也许可以使用 jOOQ 和 simpleflatmapper.org/0106-getting-started-jooq.html 之类的东西来解决这个问题。但通常情况下,拥抱 SQL 并使用 JPA 人员所谓的“投影”(即简单的 SQL)非常简单,而不必担心嵌套集合太多。

标签: java jooq


【解决方案1】:

一定是这样的:

List<Loan*> list = dsl.selectFrom(Loan).fetch(this::recordToPojo);

private Loan recordToPojo(final LoanRecord record) {
    return new Loan(
            record.getLine(),
            record.getBalance(),
            ....
    );
}

*贷款 - pojo 的名称!

【讨论】:

    【解决方案2】:

    jOOQ 3.15 解决方案使用MULTISET

    with jOOQ 3.15, the standard SQL MULTISET operator was introduced 开始,如果需要,可以使用 SQL/XML 或 SQL/JSON 进行模拟。为简单起见,我假设您的 LoanPerson 类是 Java 16 记录:

    List<Loan> result =
    ctx.select(
          // Project the loan columns you need
          LOAN.LINE,
          LOAN.BALANCE,
          ..
          multiset(
            select(PERSON.NAME, PERSON.DOCUMENT_NUMBER, ...)
            .from(PERSON)
            .join(LOAN_PERSON_REL)
            .on(PERSON.PERSON_ID.eq(LOAN.PERSON_REL.PERSON_ID))
            .where(LOAN_PERSON_REL.LOAN_ID.eq(LOAN.LOAN_ID))
          ).as("persons").convertFrom(r -> r.map(Records.mapping(Person::new)))
       )
       .from(LOAN)
       .fetch(Records.mapping(Loan::new));
    

    使用new jOOQ 3.15 ad-hoc converter feature 映射到LoanPerson 构造函数引用是类型安全且无反射的。

    与基于 JPA 的 ORM 不同,jOOQ 不提供对象 graph 持久性,即您的 Person 对象不能包含对 Loan 对象的基于身份的引用。相反,这种方法以树的形式投影数据,这可能适合您的用例。

    使用 SQL/XML 或 SQL/JSON 的 jOOQ 3.14 解决方案

    从 jOOQ 3.14 开始,这里的首选方法是 nest your collections directly in SQL using SQL/XML or SQL/JSON。你可以这样写一个查询:

    List<Loan> result =
    ctx.select(
          // Project the loan columns you need, or all of them using LOAN.asterisk()
          LOAN.LINE,
          LOAN.BALANCE,
          ...
          field(select(
            jsonArrayAgg(jsonObject(
              key("name").value(PERSON.NAME),
              key("documentNumber").value(PERSON.DOCUMENT_NUMBER),
              ...
            ))
            .from(PERSON)
            .join(LOAN_PERSON_REL)
            .on(PERSON.PERSON_ID.eq(LOAN.PERSON_REL.PERSON_ID))
            .where(LOAN_PERSON_REL.LOAN_ID.eq(LOAN.LOAN_ID))
          )).as("persons")
        )
       .from(LOAN)
       .fetchInto(Loan.class);
    

    同样的限制适用于获取树而不是图表。

    请注意,JSON_ARRAYAGG() 将空集聚合到 NULL,而不是空集 []If that's a problem, use COALESCE()

    【讨论】:

      猜你喜欢
      • 2023-03-02
      • 2020-07-22
      • 2016-11-08
      • 2016-10-23
      • 2020-12-26
      • 2020-06-11
      • 2021-04-02
      • 2017-06-11
      • 2017-01-07
      相关资源
      最近更新 更多