将休眠@Formula(大小写)转换为 JOOQ 字段



我正在将整个数据库访问层从休眠重写到 JOOQ,我面临以下问题。

其中一个 JPA 模型使用注释进行注释@Formula如下所示:

@Formula("(case"
    + "  when field1 >= 0.5 then 2"
    + "  when field1 >= 0.2 then 1"
    + "  else 0 end)")
private int field2;

我看到了以下问题:将休眠@Formula转换为 JOOQ 字段但它并没有真正帮助

如何将上述查询转换为JOOQ DSL?

jOOQ 手册中关于CASE表达式的部分将帮助您:

http://www.jooq.org/doc/latest/manual/sql-building/column-expressions/case-expressions

本质上,您应该构建的表达式将如下所示:

Field<Integer> field2 = 
DSL.when(TABLE.FIELD1.ge(0.5), 2)
   .when(TABLE.FIELD1.ge(0.2), 1)
   .otherwise(0);

当然,jOOQ 不是基于注释的 API,因此您不能使用注释在目标实体上自动生成该值。就像在SQL中一样,您将在所有相关查询中使用上述field2表达式,例如

DSL.using(configuration)
   .select(TABLE.ID, TABLE.FIELD1, field2)
   .from(TABLE)
   .fetch();

请注意,从 jOOQ 3.17 开始,您还可以将此类表达式直接附加到生成的代码中,以便在 jOOQ 中获得更@Formula风格的体验。该功能称为虚拟客户端计算列。

最新更新