Java jooq mysql选择依据<;R扩展记录>;唯一键,与字段名无关

Java jooq mysql选择依据<;R扩展记录>;唯一键,与字段名无关,java,mysql,jooq,Java,Mysql,Jooq,我正在编写一个方法,将一条记录插入或更新到mysql表中,只有当字段“sample_time”大于表中当前记录的这个值时,才会进行更新。下面是我现在想做的事情 public <R extends Record> void upsertRecord(Table<R> table, R record) { Connection conn = getConnection(); DSL.using(getConfiguration()).transaction(

我正在编写一个方法,将一条记录插入或更新到mysql表中,只有当字段“sample_time”大于表中当前记录的这个值时,才会进行更新。下面是我现在想做的事情

 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);
        }
    });
}
public void upsertRecord(表,R记录){
连接conn=getConnection();
DSL.using(getConfiguration()).transaction(配置->{
try(DSLContext=DSL.using(configuration)){
R old=//使用表的唯一键进行选择
//比如if(old.get(“update\u time”)
但我不知道如何通过记录的唯一键进行选择,而不考虑确切的字段名称或字段编号。因此我的问题是:

  • 我如何实现“按记录的唯一键选择,而不考虑确切的字段名称或字段编号”
  • 或者,我如何在jooq中使用条件为重复更新的条件

  • 提前感谢您的帮助!

    您可以通过以下方式获得对
    PrimaryKey
    元信息的引用:

    UniqueKey key=table.getPrimaryKey();
    if(key!=null){
    列表字段=key.getFields();
    //现在从这些字段创建条件
    }
    
    您可以通过以下方式获得对
    PrimaryKey
    元信息的引用:

    UniqueKey key=table.getPrimaryKey();
    if(key!=null){
    列表字段=key.getFields();
    //现在从这些字段创建条件
    }
    
    您似乎在jOOQ之上实现了“乐观锁定”。您知道这个功能吗?您似乎在实现“乐观锁定”“在约克之上。你知道这个功能吗?非常感谢。它适用于单个主键,但似乎不适用于复合主键。。。我已经更新了问题中的代码。@user3352035:我可以建议您恢复编辑并提出新问题吗?很有可能:1)你的新问题与你的前一个问题不太相关2)如果你将我的答案复制到你的问题中,这个问题(和我的答案)对将来访问这个问题的人将变得不太有用。你是对的,我已经回复了这个问题。谢谢你的帮助!:)@用户3352035:太好了,谢谢。我会留意你的新问题并在那里回答。没关系,我发现了我的错误,我错误地使用了字段(tf.getName())而不是getValue(tf.getName()),正确的选择sql应该是:selectQuery.addConditions(tf.eq(record.getValue(tf.getName());非常感谢。它适用于单个主键,但似乎不适用于复合主键。。。我已经更新了问题中的代码。@user3352035:我可以建议您恢复编辑并提出新问题吗?很有可能:1)你的新问题与你的前一个问题不太相关2)如果你将我的答案复制到你的问题中,这个问题(和我的答案)对将来访问这个问题的人将变得不太有用。你是对的,我已经回复了这个问题。谢谢你的帮助!:)@用户3352035:太好了,谢谢。我会留意你的新问题并在那里回答。没关系,我发现了我的错误,我错误地使用了字段(tf.getName())而不是getValue(tf.getName()),正确的选择sql应该是:selectQuery.addConditions(tf.eq(record.getValue(tf.getName());
    UniqueKey<R> key = table.getPrimaryKey();
    if (key != null) {
        List<TableField<R, ?>> fields = key.getFields();
    
        // Now create your condition from these fields
    }