2

我正在尝试使用 java 中的 jooq 插入到 books 表中。书籍表有两列 book_id integer,jsonb_column jsonb。然而,最终形成的查询是不正确的。未填充 jsonb 的值。这是我形成的查询。

insert into book (book_id, jsoncolumn) values (902, );

下面是我的java代码。

    Field[] columnNames= new Field[2];
    columnNames[0]=field("book_id");
    columnNames[1]= field("jsoncolumn");
    
    Field[] columnValues= new Field[2];
    columnValues[0]=field("902");
    columnValues[1]=field("{}");
    Query query= create.insertInto(table("book"), 
            columnNames)
            .values(columnValues);
    
    String sql = query.getSQL();
    System.out.println(sql);

如何解决这个问题?

4

1 回答 1

2

如果您使用的是代码生成器(我强烈推荐!),那么大部分 jOOQ 都是开箱即用的。您的查询将简单地阅读:

ctx.insertInto(BOOK, BOOK.BOOK_ID, BOOK.JSONCOLUMN)
   .values(902, JSONB.jsonb("{}"))
   .execute();

如果由于某种原因您不能使用代码生成器,那么您必须手动执行代码生成器为您执行的操作。以下是你犯的错误:

  1. 您没有为字段表达式指定数据类型
  2. 您使用纯 SQL 模板来定义列的值,而不是绑定值

这是您的代码的固定版本:

Table<?> book = table(name("book"));
Field<Long> bookId = field(name("book_id"), SQLDataType.BIGINT);
Field<JSONB> jsoncolumn = field(name("jsoncolumn"), SQLDataType.JSONB);

ctx.insertInto(book, bookId, jsoncolumn)
   .values(902L, JSONB.jsonb("{}"))
   .execute();
于 2021-02-22T15:24:14.047 回答