当前位置: 首页 > 知识库问答 >
问题:

查询DSL加入,限制为 1

凤柏
2023-03-14

我有两张这样的桌子:

+------------------+              +------------------+                                                                                                                                 
|     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个答案

华永逸
2023-03-14

更新为使用querydsl 3.6.9

使用leftJoin方法

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));
 类似资料:
  • 目前我有以下查询: 产出: 它可以工作,但在加入前限制注释表。结果是,它选择前5个注释并映射它。id为5的所有评论将被忽略。 谢谢

  • 问题内容: 如何限制JPQL命名查询的选择查询?我需要在查询级别本身而不是在Java层中完成限制!!!我正在尝试使用 但徒劳!!! 请建议 问题答案: 没有提供限制查询的机制。这通常是通过使用上的方法来实现的。如果必须避免在Java代码中指定此内容,则可以在包含查询并执行限制的数据库中进行查看。然后像将表一样将实体映射到此视图。 例:

  • 问题内容: 我正在构建一个小界面,希望用户能够写出他们的 整个 sql语句,然后查看返回的数据。但是,我不希望用户能够做任何有趣的事情,即。实际上,我希望用户能够做的唯一一件事就是运行语句。我知道没有特定的SQLite用户,所以我在考虑要制定的一套规则来拒绝某些查询。也许是正则表达式字符串之类的东西(正则表达式使我有些害怕)。关于如何做到这一点的任何想法? 问题答案: 我可以为您的问题建议另一种方

  • 我对DynamoDB上的查询/扫描限制有疑问。 我的表有1000条记录,对所有记录的查询都返回50个值,但是如果我把设为5,这并不意味着查询将返回前5个值,它只是说对5个项目的查询表(以任何顺序,所以它们可能是非常旧的项目或新的项目),所以我有可能在查询中得到0个项目。如何实际获得查询的最新5项?我需要设置一个为5(数字是例子),因为查询/扫描更多的项目会很昂贵。 该查询具有此输入 我的表的索引是

  • 问题内容: 我非常确定我们不能将LIMIT子句用于我想做的事情-因此想确定是否还有其他方法可以实现此目的。 我有一个表,其中捕获了哪个用户访问了哪个商店。每次用户访问商店时,都会在此表中插入一行。 一些领域是 shopping_id(primary key) store_id user_id 现在,我想要的是-对于给定的一组商店,找到访问该商店的最大次数的前5位用户。 我可以一次在1个商店中进行以

  • 主要内容:匹配所有查询,全文查询,匹配查询,multi_match查询,查询字符串查询,期限等级查询,范围查询,复合查询,连接查询,地理查询在Elasticsearch中,通过使用基于JSON的查询进行搜索。 查询由两个子句组成 - 叶查询子句 - 这些子句是匹配,项或范围的,它们在特定字段中查找特定值。 复合查询子句 - 这些查询是叶查询子句和其他复合查询的组合,用于提取所需的信息。 Elasticsearch支持大量查询。 查询从查询关键字开始,然后以对象的形式在其中包含条件和过滤器。以下描