我有两张这样的桌子:
+------------------+ +------------------+
| 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();
但它根本不起作用,因为SQLQuery
或SQLSubQuery
不基于EntityPath
你对如何实现它有什么建议吗?
在项目中,我们使用QueryDSL 3.6.9。
更新为使用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支持大量查询。 查询从查询关键字开始,然后以对象的形式在其中包含条件和过滤器。以下描