使用JOOQ使用两个字段的别名

时间:2017-08-25 14:03:53

标签: java jooq

我有一个讨厌的SQl,我想在JOOQ转换

以下是查询:

  SELECT 
    SUM(dpr.dpr_bruttopraemie_prt + dpr.dpr_sofortrabatt_prt) 
    , MAX(TO_NUMBER(DP1.dp_wert))  
      FROM deckungen deck, deckungspraemien dpr, 
        (SELECT dp.dp_id, dp.dp_wert 
              FROM  textbausteine txb, druckparameter dp 
              WHERE  dp.dp_txb_id = txb.txb_id 
              ) DP1 
      WHERE DP1.dp_id = :druckparameter_id;

如您所见,我需要从包含两个Fields的select中创建别名。

dp.dp_id, dp.dp_wert 

即将在其他部分使用它。

我怎么能完成它?

我见过

.asField() 

Funktion但它只为一列提供别名。

PS:实际的查询要复杂得多。所以我写了一个更简单的。 希望它能满足SQL ORACLE Dialect。

1 个答案:

答案 0 :(得分:2)

我假设您正在使用代码生成器,因此您已为DECKUNGEN生成了可用于表的对象。我还假设您正在使用这些静态导入:

import static org.jooq.impl.DSL.*;                  // The jOOQ API
import static com.example.myapp.generated.Tables.*; // Your generated tables

然后你可以写:

Deckungen deck = DECKUNGEN.as("deck");
Deckungspraemien dpr = DECKUNGSPRAEMIEN.as("dpr");
Textbausteine txb = TEXTBAUSTEINE.as("txb");
Druckparameter dp = DRUCKPARAMETER.as("dp");

Table<?> dp1 = table(
    select(dp.DP_ID, dp.DP_WERT)
   .from(txb, dp)
   .where(dp.DP_TXB_ID.eq(txb.TXB_ID))
).as("dp1");

Record2<BigDecimal, BigDecimal> result =
using(configuration)
  .select(
     sum(dpr.DPR_BRUTTOPRAEMIE_PRT.plus(dpr.DPR_SOFORTRABATT_PRT)),
     max(field("to_number({0})", BigDecimal.class, dp1.field(dp.DP_WERT))))
  .from(deck, dpr, dp1)
  .where(dp1.field(dp.DP_ID).eq(druckparameterId))
  .fetchOne();

一些解释

侧面说明

我不认为您的查询是正确的,因为您只是在表deckdprdp1之间创建笛卡尔积。具体来说,SUM()很可能是错误的,而MAX()的计算效率很低。