【问题标题】:jOOQ insert query with returning generated keysjOOQ 插入查询并返回生成的键
【发布时间】: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();

还尝试了其他不同的方法 如何正确地做到这一点?

谢谢 魅力

【问题讨论】:

    标签: java mysql sql jooq


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-06
      • 2019-03-26
      • 1970-01-01
      • 2022-07-23
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多