I am implementing a simple repository for my jOOQ example and I ran into the following problem:
When I use INSERT... RETURNING the returned object is always null if I insert individual field values instead of inserting a Record object.
My code looks as follows:
import net.petrikainulainen.spring.jooq.todo.db.tables.records.TodosRecord;
import org.jooq.impl.DefaultDSLContext;
import java.sql.Timestamp;
import static net.petrikainulainen.spring.jooq.todo.db.Sequences.TODO_SEQUENCE;
import static net.petrikainulainen.spring.jooq.todo.db.tables.Todos.TODOS;
@Repository
public class JOOQTodoRepository implements TodoRepository {
private DateTimeService dateTimeService;
private DefaultDSLContext jooq;
@Autowired
public JOOQTodoRepository(DateTimeService dateTimeService, DefaultDSLContext jooq) {
this.dateTimeService = dateTimeService;
this.jooq = jooq;
}
@Override
public Todo add(Todo todo) {
Long id = jooq.nextval(TODO_SEQUENCE);
Timestamp currentTime = dateTimeService.getCurrentTime();
TodosRecord persisted = jooq.insertInto(TODOS)
.set(TODOS.CREATION_TIME, currentTime)
.set(TODOS.DESCRIPTION, todo.getDescription())
.set(
TODOS.ID, id)
.set(TODOS.MODIFICATION_TIME, currentTime)
.set(TODOS.TITLE, todo.getTitle())
.returning()
.fetchOne();
//persisted is always null
}
}
I was pointed to this issue:
https://github.com/jOOQ/jOOQ/issues/2374. After I modified my code to use the TodosRecord class,
it looks as follows:
import net.petrikainulainen.spring.jooq.todo.db.tables.records.TodosRecord;
import org.jooq.impl.DefaultDSLContext;
import java.sql.Timestamp;
import static net.petrikainulainen.spring.jooq.todo.db.Sequences.TODO_SEQUENCE;
import static net.petrikainulainen.spring.jooq.todo.db.tables.Todos.TODOS;
@Repository
public class JOOQTodoRepository implements TodoRepository {
private DateTimeService dateTimeService;
private DefaultDSLContext jooq;
@Autowired
public JOOQTodoRepository(DateTimeService dateTimeService, DefaultDSLContext jooq) {
this.dateTimeService = dateTimeService;
this.jooq = jooq;
}
@Override
public Todo add(Todo todo) {
TodosRecord persisted = jooq.insertInto(TODOS)
.set(createRecord(todo))
.returning()
.fetchOne();
//Persisted is found
}
private TodosRecord createRecord(Todo todo) {
Long id = jooq.nextval(TODO_SEQUENCE);
Timestamp currentTime = dateTimeService.getCurrentTime();
TodosRecord record = new TodosRecord();
record.setCreationTime(currentTime);
record.setDescription(todo.getDescription());
record.setId(id);
record.setModificationTime(currentTime);
record.setTitle(todo.getTitle());
return record;
}
}
This works smoothly but I decided to post my code here so that I could ensure that I didn't miss something, and you could verify that this is the same issue which is discussed in issue 2374.
Any comments?