JOOQ selectQuery for Record5

JOOQ selectQuery for Record5

我是 JOOQ 的新手。

我需要使用 SelectQuery 和 return 结果,但 return 类型是记录。是否可以将 selectQuery 与 Record5 一起使用?或者有其他解决方案吗?

    SelectQuery<Record> query = db.selectQuery();
    query.addSelect(WARE.NAME, RECEIPTITEM.SALEPRICE, RECEIPTITEM.QUANTITY, RECEIPT.TSCCREATED, WARE.WARECATEGORYID);
    query.addFrom(RECEIPT
            .join(RECEIPTITEM).on(RECEIPT.ID.eq(RECEIPTITEM.RECEIPTID))
            .join(OUTLET).on(OUTLET.ID.eq(RECEIPT.OUTLETID))
            .join(WARE).on(WARE.ID.eq(RECEIPTITEM.WAREID)));
    query.addConditions(RECEIPT.TSCCREATED.between(start, end)
            .and(OUTLET.OWNERID.eq(ownerId)));
    if (outletId != null) {
        query.addConditions(RECEIPT.OUTLETID.eq(outletId));
    }
    if (merchantId != null) {
        query.addConditions(RECEIPT.MERCHID.eq(merchantId));
    }

您不能使用 jOOQ 创建 SelectQuery<Record5<...>> 类型。

原因是 SelectQuerywhich is part of the model API) allows you to keep adding new columns to it via SelectQuery.addSelect()(您自己完成)。每次这样的调用都会使 Record5<...> 类型无效。

但是,如果动态部分只是附加条件,则不必使用模型 API 来构造动态 SQL。您可以像这样重写您的查询:

Condition condition = RECEIPT.TSCCREATED.between(start, end)
    .and(OUTLET.OWNERID.eq(ownerId));

if (outletId != null) {
    condition = condition.and(RECEIPT.OUTLETID.eq(outletId));
}
if (merchantId != null) {
    condition = condition.and(RECEIPT.MERCHID.eq(merchantId));
}

Select<Record5<String, BigDecimal, Integer, Timestamp, Long>> select =
db.select(
       WARE.NAME, 
       RECEIPTITEM.SALEPRICE, 
       RECEIPTITEM.QUANTITY, 
       RECEIPT.TSCCREATED, 
       WARE.WARECATEGORYID)
  .from(RECEIPT
      .join(RECEIPTITEM).on(RECEIPT.ID.eq(RECEIPTITEM.RECEIPTID))
      .join(OUTLET).on(OUTLET.ID.eq(RECEIPT.OUTLETID))
      .join(WARE).on(WARE.ID.eq(RECEIPTITEM.WAREID)))
  .where(condition);