在没有代码生成的情况下使用 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);
如您所见,执行此操作一段时间后,使用代码生成器将节省很多时间...
我正在使用 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);
如您所见,执行此操作一段时间后,使用代码生成器将节省很多时间...