调用聚合函数 JOOQ 的别名列结果

Call aliased column result of aggregate function JOOQ

我目前正在尝试从 JOOQ 查询生成器和 PostgreSQL 作为数据库的查询中检索单个双精度值,前提是 DRINKS.PRICE 是双精度类型,ORDER_DRINK.QTY 是整数类型.

Record rec = create.select(DSL.sum(DRINKS.PRICE.multiply(ORDER_DRINK.QTY)).as("am_due")).from(ORDERS
                        .join(ORDER_DRINK
                            .join(DRINKS)
                            .on(DRINKS.DRINK_KEY.equal(ORDER_DRINK.DRINK_KEY)))
                        .on(ORDERS.ORDKEY.equal(ORDER_DRINK.ORDER_KEY)))
                        .where(ORDERS.TOKEN.eq(userToken))
                        .fetchOne();

正如我从(简短的)教程中了解到的那样,一旦我从该别名记录中检索到值,其形式为:

double v = rec.getValue("am_due");

我应该用所有价格的总和乘以它们的数量。 尽管如此,我还是得到了 NullPointerException。

非常欢迎任何帮助。 谢谢。

你的 jOOQ 用法是正确的,但我怀疑你的总和只是 null 因为:

  • 您的加入没有return任何记录
  • 你所有的乘法运算数都是null

并且由于您要将 Double 拆箱到 double,您会收到 NullPointerException。你可以解决这个

... 使用 Java:

Double v1 = rec.getValue("am_due");               // will return null
double v2 = rec.getValue("am_due", double.class); // will return 0.0

... 使用 jOOQ / SQL

Record rec = create.select(DSL.nvl(
  DSL.sum(
    DRINKS.PRICE.multiply(ORDER_DRINK.QTY)
  ), 0.0
).as("am_due"))