首页 > 解决方案 > Java / QueryDSL 中的行构造函数比较查询生成

问题描述

我正在尝试在使用 QueryDSL / JPA 生成查询的 Java 存储库中为 postgresql 数据库实现键集分页。通常的模式是使用BooleanBuilderquerydsl 类来构造查询,然后使用repository.findAll该查询。

就我而言,理想情况下,我想生成的查询将使用行构造函数语法,即

select * from table
     where (col1, col2) < (val1, val2)
     order by col1 desc col2 desc offset n;

但是,据我所知,querydsl 不支持这种语法。为了解决这个问题,我将上述查询转换为其逻辑等价物,即

select * from table
    where col1 < val1 or (col1 = val1 and col2 < val2)
    order by col1 desc col2 desc offset n;

事实证明,在 (col1, col2) 上使用联合索引时,行构造函数语法比其逻辑等效语法(在具有 300k 记录的表上,查询大约 5ms 对 175ms)的性能要好得多。

我更喜欢使用某种查询构建库来生成我的查询,因为有许多其他非必需参数使得为每种情况编写本机查询变得站不住脚。任何人都知道使用类似的方法来做到这一点BooleanBuilder,还是我坚持使用性能较低的查询 dsl 实现或几个粗略的本机查询?

标签: javapostgresqljpaquerydsl

解决方案


推荐阅读