Ynv
Ynv

Reputation: 1974

Less repetition in jOOQ query

Any idea on how I could define the following jOOQ query with less repetition?

I am using jOOQ 3.11.4.

db.insertInto(ACCOUNT,
        ACCOUNT.ACCOUNT_ID,
        ACCOUNT.EMAIL,
        ACCOUNT.FIRST_NAME,
        ACCOUNT.LAST_NAME,
        ACCOUNT.IS_ADMIN,
        ACCOUNT.PASSWORD)
        .values(account.accountId,
            account.email,
            account.firstName,
            account.lastName,
            account.isAdmin,
            account.password)
        .onConflict(ACCOUNT.ACCOUNT_ID)
        .doUpdate()
        .set(ACCOUNT.EMAIL, account.email)
        .set(ACCOUNT.FIRST_NAME, account.firstName)
        .set(ACCOUNT.LAST_NAME, account.lastName)
        .set(ACCOUNT.IS_ADMIN, account.isAdmin)
        .set(ACCOUNT.PASSWORD, account.password)
        .returning(
            ACCOUNT.ACCOUNT_ID,
            ACCOUNT.EMAIL,
            ACCOUNT.FIRST_NAME,
            ACCOUNT.LAST_NAME,
            ACCOUNT.IS_ADMIN,
            ACCOUNT.PASSWORD
        )
        .fetchOne()

(I turns out my question is mostly code, and StackOverflow does not let me post it as is, without adding more details, which I do not think is necessary for my question, but nevertheless, they want me to post some more text, which I am doing right now by typing this message, and I hope you did not have to read to the end.)

Upvotes: 1

Views: 53

Answers (1)

Lukas Eder
Lukas Eder

Reputation: 221265

Since you're passing all the columns to the insert statement, you might write this instead:

// Create an AccountRecord that contains your POJO data
Record rec = db.newRecord(ACCOUNT);
rec.from(account);

// Don't pass the columns to the insert statement explicitly
db.insertInto(ACCOUNT)

// But pass the record to the set method. It will use all the changed values
  .set(rec)

// Use the MySQL syntax, which can be emulated on PostgreSQL using ON CONFLICT
  .onDuplicateKeyUpdate()

// But pass the record to the set method again
  .set(rec)

// Don't specify any columns to the returning clause. It will take all the ACCOUNT columns
  .returning()
  .fetchOne();

Upvotes: 2

Related Questions