QueryDSL加入限制1

时间:2018-04-03 17:16:42

标签: querydsl

我有两张这样的表:

+------------------+              +------------------+                                                                                                                                 
|     CHANGESET    | 1         N  |     DECISION     |                                                                                                                                 
|                  |--------------|                  |                                                                                                                                 
|                  |              |                  |                                                                                                                                 
+------------------+              +------------------+                                                                                                                                 

我需要根据一些标准获取CHANGESET记录列表,并且只加入一条DECISION记录,最后一条记录基于dateTimeStamp。

所以,我有这样的查询:

SELECT * FROM CHANGESET ch
  LEFT JOIN (
    SELECT * FROM
      (
        SELECT * FROM CHANGESETDECISION
        ORDER BY DECISIONTIMESTAMP DESC
      )
    WHERE ROWNUM = 1
    ) chd
      ON chd.CHANGESETID = ch.ID
  WHERE ch.CHANGESETSTATUSID IN ('DRAFT','APPROVED')
          -- AND some other criteria...
ORDER BY ch.ID;

或者我可以使用以下查询获得相同的结果:

SELECT * FROM
  (
    SELECT
      RANK()
      OVER (
        PARTITION BY CH.ID
        ORDER BY CHD.DECISIONTIMESTAMP ) rnk,
      ch.*,
      chd.DECISIONTIMESTAMP,
      chd.CHANGESETID
    FROM CHANGESET ch
      LEFT JOIN CHANGESETDECISION chd ON chd.CHANGESETID = ch.ID
  ) WHERE rnk = 1;

我需要的是在QueryDSL中编写它。我试过这样的事情:

    private SQLQuery getLastApproved() {
        return createQuery()
            .from(CHANGESETDECISION)
            .limit(1)
            .orderBy(new OrderSpecifier<>(Order.DESC, CHANGESETDECISION.decisiontimestamp))
            .where(CHANGESETDECISION.approved.eq(COMMON_YES_VALUE));
    }

并加入:

createQuery()
            .from(CHANGESET)
            .leftJoin(getLastApproved())
            .where(CHANGESETDECISION.decisiontimestamp.isNull().or(CHANGESETDECISION.decisiontimestamp.eq(getTimestamp())))
            .list();

但它根本不起作用,因为SQLQuerySQLSubQuery不是基于EntityPath<?>

您对如何实现它有什么建议吗?

在项目中,我们使用的是QueryDSL 3.6.9。

1 个答案:

答案 0 :(得分:0)

更新后使用querydsl 3.6.9

使用leftJoin方法public Q leftJoin(SubQueryExpression<?> target, Path<?> alias)举例说明如何使用querydsl 3.6.9。

PathBuilder<String> alias = new PathBuilder<>(String.class, "alias");
query.from(dual)
        .leftJoin(new SQLSubQuery()
                .from(dual)
                .list(dual.dummy), alias)
        .on(alias.get(dual.dummy).eq(dual.dummy));