значения json не поддерживаются jooq

#java #postgresql #jooq #jooq-codegen-maven

#java #postgresql #jooq #jooq-codegen-maven

Вопрос:

Я пытаюсь вставить в таблицу books с помощью jooq в java. таблица 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);
 

Как это сделать?

Ответ №1:

Если вы использовали генератор кода (который я настоятельно рекомендую!), То большая часть 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();
 

Комментарии:

1. что именно такое BOO, BOOK.BOOK_ID … это строка? также это приводит к ошибке компиляции JSONB.jsonb

2. кроме того, исправленная версия кода также выдает ошибку компиляции для меня в JSONB.jsonb. это то, что я пытаюсь сделать org.jooq.JSONB.jsonb(«{}»)

3. @Abhishek: «что именно такое BOO, BOOK.BOOK_ID» — Ну, я рекомендовал использовать генератор кода, так что это сгенерированный код. Смотрите Примеры здесь . Серьезно. Используйте генератор кода, если можете (т. Е. Если ваша схема не является динамической). У вас будет гораздо лучший опыт работы с jOOQ, а не просто хороший. 🙂 » также это выдает мне ошибку компиляции JSONB.jsonb » — я предполагаю, что вы используете последнюю версию jOOQ. В противном случае используйте JSONB.valueOf() , который делает то же самое.