Cha*_*997 3 sql nested-set-model jooq
这是嵌套集模型的"添加节点"SQL查询
LOCK TABLE mytestdb.tbltree WRITE;
SELECT @myRight := rgt FROM mytestdb.tbltree
WHERE name = 'apples';
UPDATE mytestdb.tbltree SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE mytestdb.tbltree SET lft = lft + 2 WHERE lft > @myRight;
INSERT INTO mytestdb.tbltree(name, lft, rgt)
VALUES('beans', @myRight + 1, @myRight + 2);
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)
并映射到jOOQ
Record record = create.select(Tbltree.RGT)
.from(Tbltree.TBLTREE)
.where(Tbltree.NAME.equal("apples"))
.fetchOne();
int myright = record.getValue(Tbltree.RGT);
create.update(Tbltree.TBLTREE).set(Tbltree.RGT, Tbltree.RGT.add(2))
.where(Tbltree.RGT.greaterThan(myright)).execute();
create.update(Tbltree.TBLTREE).set(Tbltree.LFT, Tbltree.LFT.add(2))
.where(Tbltree.LFT.greaterThan(myright)).execute();
TbltreeRecord record2 = (TbltreeRecord) create
.insertInto(Tbltree.TBLTREE, Tbltree.NAME, Tbltree.LFT, Tbltree.RGT)
.values("cherries",myright+1,myright+2)
.returning(Tbltree.ID)
.fetchOne();
Run Code Online (Sandbox Code Playgroud)
我应该如何锁定桌子?我是不是该?
谢谢
我不太确定你的各种查询在做什么,所以我不知道在你的情况下是否需要显式表锁定.但我可以帮助你解决语法问题.
从你的语法,我猜你正在使用MySQL作为底层数据库.您至少有三个选项可以将SQL转换为jOOQ:
LOCK TABLES在jOOQ中也使用MySQL 语句:
try {
create.execute("LOCK TABLES mytestdb.tbltree WRITE");
// [...] your jOOQ code
}
// Be sure to unlock your tables again, in case of failure!
finally {
create.execute("UNLOCK TABLES");
}
Run Code Online (Sandbox Code Playgroud)使用该FOR UPDATE子句,该子句也由SQL-1992规范(用于游标)指定.这个解决方案可能有点贵,因为MySQL实际上会为以下内容准备一个游标Result:
create.selectFrom(TBLTREE).forUpdate().execute();
Run Code Online (Sandbox Code Playgroud)扩展jOOQ并org.jooq.Query为LOCK TABLES和UNLOCK TABLES语句创建自己的.