在没有代码生成的情况下使用 jOOQ 生成 SQL 时如何使用 jOOQ 转换器?

How to use jOOQ converter when using jOOQ to generate SQL without Code-genreation?

我正在使用 jOOQ 生成 mySql 查询而不生成代码并且不使用 jooq 查询数据库。

当我创建这样的查询时:

String tableName = "sample_table";        
DSLContext create = DSL.using(SQLDialect.MYSQL);
Table<Record> table = DSL.tableByName(tableName);
String sql1 = create.insertInto(table, Arrays.asList(
            DSL.fieldByName("id"),
            DSL.fieldByName("roll_no"),
            DSL.fieldByName("name"),
            DSL.fieldByName("date_enrolled"),
            DSL.fieldByName("sex")
            ))
    .values(
            "1",
            12,
            "Raman",
            new DateTime(),
            Sex.Male
           )
    .getSQL(ParamType.INLINED);

生成的查询如下所示:

insert into `sample_table` (`id`, `roll_no`, `name`, `date_enrolled`, `sex`) values ('1', 12, 'Raman', '2016-04-03T03:55:37.940+05:30', 'Male')

MySQL 不接受此处生成的日期时间值。我探索并发现 jOOQ converter can be used for custom conversions. I could find examples on how to use conversion while fetching data,但无法弄清楚如何在查询时使用转换器。如何在没有代码生成的情况下使用 jOOQ Convertor 生成 SQL ?或者,如果有任何更好的方法可以为 sql.

生成此查询

(我在这个答案中假设您的 DateTime 类型确实是 org.joda.time.DateTime

改用 JDBC Timestamp

这里最简单的方法是手动将 DateTime 数据类型转换为 JDBC Timestamp

new Timestamp(new DateTime().getMillis());

只是偶尔使用转换器。

当您不使用代码生成器时,使用转换器和数据类型绑定会更加乏味。我个人反对。

不过,您可以通过创建一个包含转换器的新 DataType 将转换器间接传递给绑定变量:

// This will be your converter
class DateTimeConverter implements Converter<Timestamp, DateTime> { ... }

// This is how you create a new data type:
public static final DataType<DateTime> DATETIME = 
    SQLDataType.TIMESTAMP.asConvertedDataType(new DateTimeConverter);

您现在可以在构造绑定变量的任何地方重用上述 DATETIME 数据类型,例如:

Field<DateTime> value = DSL.val(new DateTime(), DATETIME);

然后插入那个。

定期使用转换器。

比始终使用 DSL.val() 调用显式包装单个绑定值要好得多,您可以像这样声明 table 的各个字段:

Field<Integer> id = field(name("id"), Integer.class);
Field<Integer> rollNo = field(name("roll_no"), Integer.class);
Field<String> name = field(name("name"), String.class);
Field<DateTime> dateEnrolled = field(name("date_enrolled"), DATETIME);
Field<Object> sex = field(name("sex")); // Don't know what this type is in your code

现在,您可以使用上述字段通过您的转换器插入数据:

create.insertInto(table, 
          id, rollNo, name, dateEnrolled, sex)
      .values(
          "1",
          12,
          "Raman",
          new DateTime(),
          Sex.Male)
      .getSQL(ParamType.INLINED);

如您所见,执行此操作一段时间后,使用代码生成器将节省很多时间...