【问题标题】:How do i write JOOQ select query for the following MSSQL query?如何为以下 MSSQL 查询编写 JOOQ 选择查询?
【发布时间】:2015-11-15 06:52:15
【问题描述】:

如何将下面的选择查询从 MSSQL 转换为 JOOQ 格式?

MySql 查询:

SELECT group_concat(AUF.AcLineId )
FROM AcHeader as AH 
INNER JOIN AcDetails AS AD 
  ON AD.AcHeaderId = AH.AcHeaderId 
INNER JOIN AcUserField AS AUF 
  ON AUF.AcLineId = AD.AcLineId 
  AND AUF.FieldNo = 1 
WHERE  AH.Company = 1 AND AH.AccountNo = 190000 AND AH.Status IN ('C', 'D')  

Jooq 查询:

dslContext.select(AUF.AcLineId)
          .from(AcHeader)
          .Join(AcDetails)
            .on(AcDetails.AcHeaderId.equal(AcHeader.AcHeaderId))
          .Join(AcUserField )
            .on(AcUserField.AcLineId.equal(AcDetails.AcLineId))
            .and(AcUserField.FieldNo.equal())
          .Where(AcHeader.Company=1)
          .and(AcHeader=AccountNo=190000).and(Status.in("'C','D'")).fetch()

我认为还完成了,但在这里我很难形成 group_concat。 如果有想法,请与我分享。

【问题讨论】:

    标签: hibernate spring-mvc jooq


    【解决方案1】:

    jOOQ 原生支持 MySQL 的 GROUP_CONCAT() 函数为 DSL.groupConcat()。这是您对 cme​​ts 的更正查询:

    // Don't forget, of course:
    import org.jooq.impl.DSL;
    

    然后

    // Use DSL.groupConcat() here
    dslContext.select(DSL.groupConcat(AcUserField.AcLineId))
              .from(AcHeader)
    
              // Lower-case join()
              .join(AcDetails)
                .on(AcDetails.AcHeaderId.equal(AcHeader.AcHeaderId))
    
              // Lower-case join()
              .join(AcUserField)
                .on(AcUserField.AcLineId.equal(AcDetails.AcLineId))
    
              // Forgot to pass the parameter "1"
                .and(AcUserField.FieldNo.equal(1))
    
              // Lower-case where() and use .equal() or .eq() rather than a Java assignment "="
              .where(AcHeader.Company.equal(1))
              .and(AcHeader.AccountNo.equal(190000))
    
              // List values in in(...) predicate individually, don't put them all
              // in a single string.
              .and(AcHeader.Status.in("C", "D")).fetch()
    

    或者,如果您更喜欢使用表的别名版本,您可以这样做:

    AcHeader AH = AcHeader.as("AH");
    AcDetails AD = AcDetails.as("AD");
    AcUserField AUF = AcUserField.as("AUF");
    
    dslContext.select(DSL.groupConcat(AUF.AcLineId))
              .from(AH)
              .join(AD)
                .on(AD.AcHeaderId.equal(AcHeader.AcHeaderId))
              .join(AUF)
                .on(AUF.AcLineId.equal(AD.AcLineId))
                .and(AUF.FieldNo.equal(1))
              .where(AH.Company.equal(1))
              .and(AH.AccountNo.equal(190000))
              .and(AH.Status.in("C", "D")).fetch()
    

    【讨论】:

    • @user3091530:你错过了什么?该方法链接到Javadoc...我将在答案中添加所需的导入语句,以防万一
    猜你喜欢
    • 2023-03-15
    • 2021-05-01
    • 2014-03-18
    • 2020-03-25
    • 1970-01-01
    • 2019-08-20
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多