jOOQ 插入查询并返回生成的键
Posted
技术标签:
【中文标题】jOOQ 插入查询并返回生成的键【英文标题】:jOOQ insert query with returning generated keys 【发布时间】:2011-12-28 23:13:56 【问题描述】:我将 jOOQ 安装到 Eclipse 中,为我的 mysql 生成了类,但我仍然无法编写一些基本查询。
我尝试通过返回生成的键来编写插入查询,但编译器抛出错误
表:tblCategory 列:category_id、parent_id、name、rem、uipos
Result<TblcategoryRecord> result= create.insertInto(Tblcategory.TBLCATEGORY,
Tblcategory.PARENT_ID, Tblcategory.NAME, Tblcategory.REM, Tblcategory.UIPOS)
.values(node.getParentid())
.values(node.getName())
.values(node.getRem())
.values(node.getUipos())
.returning(Tblcategory.CATEGORY_ID)
.fetch();
还尝试了其他不同的方法 如何正确地做到这一点?
谢谢 魅力
【问题讨论】:
【参考方案1】:您使用的语法是用于插入多条记录。这将插入 4 条记录,每条记录都有一个字段。
.values(node.getParentid())
.values(node.getName())
.values(node.getRem())
.values(node.getUipos())
但是你声明了 4 个字段,所以这行不通:
create.insertInto(Tblcategory.TBLCATEGORY,
Tblcategory.PARENT_ID, Tblcategory.NAME, Tblcategory.REM, Tblcategory.UIPOS)
你可能想做的是:
Result<TblcategoryRecord> result = create
.insertInto(Tblcategory.TBLCATEGORY,
Tblcategory.PARENT_ID, Tblcategory.NAME, Tblcategory.REM, Tblcategory.UIPOS)
.values(node.getParentid(), node.getName(), node.getRem(), node.getUipos())
.returning(Tblcategory.CATEGORY_ID)
.fetch();
或者:
Result<TblcategoryRecord> result = create
.insertInto(Tblcategory.TBLCATEGORY)
.set(Tblcategory.PARENT_ID, node.getParentid())
.set(Tblcategory.NAME, node.getName())
.set(Tblcategory.REM, node.getRem())
.set(Tblcategory.UIPOS, node.getUipos())
.returning(Tblcategory.CATEGORY_ID)
.fetch();
也许,你会更好地使用
TblcategoryRecord result =
// [...]
.fetchOne();
有关更多详细信息,请参阅手册:
http://www.jooq.org/doc/2.6/manual/sql-building/sql-statements/insert-statement/
或用于创建返回值的 INSERT
语句的 Javadoc:
http://www.jooq.org/javadoc/latest/org/jooq/InsertReturningStep.html
【讨论】:
谢谢,添加了首选解决方案,但 Eclipse 仍需要强制转换 @Charis997:通常不建议将答案放在 Stack Overflow 上的问题中。后续访问者将很难理解发生了什么。相反,如果这个答案不够清楚,您可以“接受”这个答案,或者自己提供一个答案 @Charis997:关于选角:你是对的。对于 jOOQ 2.0,这将不再是必要的。但是 jOOQ 1.6.9 仍然需要它 让我们尊重代码!首选解决方案发布在下面的答案中。期待 jOOQ 2.0 Thx @andresp,您可以调用set(record)
,将更改的字段从记录转移到插入语句...【参考方案2】:
首选解决方案
try
TblcategoryRecord record = (TblcategoryRecord) create
.insertInto(Tblcategory.TBLCATEGORY)
.set(Tblcategory.PARENT_ID, node.getParentid())
.set(Tblcategory.NAME, node.getName())
.set(Tblcategory.REM, node.getRem())
.set(Tblcategory.UIPOS, node.getUipos())
.returning(Tblcategory.CATEGORY_ID)
.fetchOne();
node.setId(record.getCategoryId());
catch (SQLException e1)
【讨论】:
你真的不应该忽略那个 SQLException!如果这只是一个示例,您可以将整个 try/catch 块排除在外。【参考方案3】:试试
YoutableRecord result = create
.insertInto(YOURTABLE)
.set(YOURTABLE.PROD_NAME, "VAL")
.returning(YOURTABLE.ID_PR)
.fetchOne();
int id = result.getValue(Products.PRODUCTS.ID_PR);
【讨论】:
以上是关于jOOQ 插入查询并返回生成的键的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法用 JOOQ 生成 DAO,findById 返回 Optional
如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值
org.jooq.Query.getBindValues() 返回的 List<Object> 是不是包含类型安全的对象 - 对于每个查询参数?