2017-02-14 3 views
1

mysql 테이블에 레코드를 삽입하거나 업데이트하는 메소드를 작성하고 있는데 "sample_time"필드가 이 테이블의 현재 레코드 값. 다음은 지금 어떻게하고 싶은가입니다.jooq mysql은 필드 이름과 관계없이 <R extends Record> 고유 키를 사용합니다.

public <R extends Record> void upsertRecord(Table<R> table, R record) { 
    Connection conn = getConnection(); 
    DSL.using(getConfiguration()).transaction(configuration -> { 
     try (DSLContext dslContext = DSL.using(configuration)) { 

      R old = // select with unique keys of table 


      // something like if (old.get("update_time) < record.get("update_time")) 
       dslContext.insertInto(table).set(record).onDuplicateKeyUpdate().set(record).execute(); 
       conn.commit(); 
      // } 
     } catch (SQLException e) { 
      // TODO 
     } finally { 
      closeConnection(conn); 
     } 
    }); 
} 

하지만 정확한 필드 이름 또는 필드의 수에 관한 레코드의 고유 키에 의해 선택하는 방법을 모르겠어요. 그래서 제 질문은 :

    내가 구현 나는 상태와 중복 갱신에 조건을 사용할 수있는 방법을 다른
  1. 또는 '정확한 필드 이름 또는 필드 수에 관한 레코드의 고유 키에 의해 선택'수있는 방법을
  2. jooq

도움을 주셔서 감사합니다.

+0

당신은 jOOQ의 상단에 "낙관적 잠금"을 구현하는 것 같다. 이 기능을 알고 있습니까? https://www.jooq.org/doc/latest/manual/sql-execution/crud-with-updatablerecords/optimistic-locking –

답변

0

당신은 Table.getPrimaryKey() 통해 PrimaryKey 메타 정보에 대한 참조를 얻을 수 있습니다

UniqueKey<R> key = table.getPrimaryKey(); 
if (key != null) { 
    List<TableField<R, ?>> fields = key.getFields(); 

    // Now create your condition from these fields 
} 
+0

고마워요! 그것은 하나의 기본 키와 잘 작동하지만 복합 기본 키와 함께 작동하지 않는 것 같습니다 ... 질문에 내 코드를 업데이트했습니다. – user3352035

+0

@ user3352035 : 수정 사항을 되돌리고 새로운 질문을 할 것을 제안 할 수 있습니까? 매우 가능성이 높습니다 : 1) 귀하의 새로운 질문은 귀하의 이전 질문과 관련이 없습니다. 2) 귀하의 질문에 내 대답을 복사하면이 질문 (및 제 대답)은 앞으로이 질문을 방문 할 사람에게 유용하지 않게됩니다 . –

+0

맞아, 나는 질문을 되돌 렸어. 도와 주셔서 감사합니다! :) – user3352035