我正在使用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可用于自定义转化。我可以在how to use conversion while fetching data上找到示例,但无法弄清楚如何在查询时使用转换器。如何在没有代码生成的情况下使用jOOQ Convertor生成SQL?或者,如果有更好的方法可以为sql生成此查询。
答案 0 :(得分:2)
(我在这个答案中假设你的DateTime
类型确实是org.joda.time.DateTime
)
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()
调用显式包装单个绑定值要好得多,您可以像这样声明表的各个字段:
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);
正如您所看到的,经过一段时间的这样做,您将通过使用代码生成器来节省大量时间......