Java jooq mysql选择依据<;R扩展记录>;唯一键,与字段名无关
我正在编写一个方法,将一条记录插入或更新到mysql表中,只有当字段“sample_time”大于表中当前记录的这个值时,才会进行更新。下面是我现在想做的事情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(
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”)
但我不知道如何通过记录的唯一键进行选择,而不考虑确切的字段名称或字段编号。因此我的问题是:
提前感谢您的帮助!您可以通过以下方式获得对
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
}