jOOQ - 基于唯一键(不是主键)更新记录
jOOQ - update record based on unique key (not primary key)
我正在使用 jOOQ 为我的数据库 table 生成 POJO。这很好用。
我有一个带有主键 (identifier
) 和唯一键 (name
) 的 table。更新记录时,jOOQ使用主键。
我想使用唯一键而不是主键来更新记录。
https://github.com/jOOQ/jOOQ/blob/master/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java
@Override
public final int update() {
return update(fields.fields.fields);
}
@Override
public int update(Field<?>... storeFields) throws DataAccessException, DataChangedException {
return storeUpdate(storeFields, getPrimaryKey().getFieldsArray());
}
本质上,我想用另一个键(第二个参数)调用storeUpdate
。我尝试扩展生成的记录,但 storeUpdate
是私有的。
还有其他更新记录的方法吗?我可以先 select update()
之前的标识符,但它引入了一个我想避免的额外查询。
从评论中,我了解到您想要:
- 将生成的记录用作 "ActiveRecords" 保存将要存储/更新到 table
中的数据
- 使用任意 "key" 信息作为更新语句的选择标准
您可以通过两种方式使用 jOOQ 执行此操作:
1。覆盖代码生成器中的主键信息
您可以指定一个匹配数据库中唯一键名的正则表达式,它应该覆盖生成的代码中的主键:
<!-- All (UNIQUE) key names that should be used instead of primary keys on
generated UpdatableRecords, to be used with
- UpdatableRecord.store()
- UpdatableRecord.update()
- UpdatableRecord.delete()
- UpdatableRecord.refresh()
If several keys match, a warning is emitted and the first one encountered
will be used.
This flag will also replace synthetic primary keys, if it matches. -->
<overridePrimaryKeys>MY_UNIQUE_KEY_NAME</overridePrimaryKeys>
请注意,此解决方案将影响 所有 对 store()
、update()
等的调用。根据您的评论,这可能不是所需的行为... For more information, see the jOOQ manual
2。使用常规更新语句
您可以将整个UpdatableRecord
传递给一个UPDATE
语句并明确指定选择条件,例如:
MyTableRecord record = ...;
DSL.using(configuration)
.update(MY_TABLE)
.set(record)
.where(MY_TABLE.NAME.eq(record.getName())
.execute();
我正在使用 jOOQ 为我的数据库 table 生成 POJO。这很好用。
我有一个带有主键 (identifier
) 和唯一键 (name
) 的 table。更新记录时,jOOQ使用主键。
我想使用唯一键而不是主键来更新记录。
https://github.com/jOOQ/jOOQ/blob/master/jOOQ/src/main/java/org/jooq/impl/UpdatableRecordImpl.java
@Override
public final int update() {
return update(fields.fields.fields);
}
@Override
public int update(Field<?>... storeFields) throws DataAccessException, DataChangedException {
return storeUpdate(storeFields, getPrimaryKey().getFieldsArray());
}
本质上,我想用另一个键(第二个参数)调用storeUpdate
。我尝试扩展生成的记录,但 storeUpdate
是私有的。
还有其他更新记录的方法吗?我可以先 select update()
之前的标识符,但它引入了一个我想避免的额外查询。
从评论中,我了解到您想要:
- 将生成的记录用作 "ActiveRecords" 保存将要存储/更新到 table 中的数据
- 使用任意 "key" 信息作为更新语句的选择标准
您可以通过两种方式使用 jOOQ 执行此操作:
1。覆盖代码生成器中的主键信息
您可以指定一个匹配数据库中唯一键名的正则表达式,它应该覆盖生成的代码中的主键:
<!-- All (UNIQUE) key names that should be used instead of primary keys on
generated UpdatableRecords, to be used with
- UpdatableRecord.store()
- UpdatableRecord.update()
- UpdatableRecord.delete()
- UpdatableRecord.refresh()
If several keys match, a warning is emitted and the first one encountered
will be used.
This flag will also replace synthetic primary keys, if it matches. -->
<overridePrimaryKeys>MY_UNIQUE_KEY_NAME</overridePrimaryKeys>
请注意,此解决方案将影响 所有 对 store()
、update()
等的调用。根据您的评论,这可能不是所需的行为... For more information, see the jOOQ manual
2。使用常规更新语句
您可以将整个UpdatableRecord
传递给一个UPDATE
语句并明确指定选择条件,例如:
MyTableRecord record = ...;
DSL.using(configuration)
.update(MY_TABLE)
.set(record)
.where(MY_TABLE.NAME.eq(record.getName())
.execute();