如何使用 QueryDSL 在查询中使用 SAMPLE 关键字

Posted

技术标签:

【中文标题】如何使用 QueryDSL 在查询中使用 SAMPLE 关键字【英文标题】:How to use SAMPLE Keyword in query using QueryDSL 【发布时间】:2020-07-17 12:12:59 【问题描述】:

sample_clause

sample_clause 允许您指示数据库从表中的随机数据样本中进行选择,而不是从整个表中进行选择。

我想使用 QueryDSL 在查询下方运行

sample_clause

sample_clause 允许您指示数据库从表中的随机数据样本中进行选择,而不是从整个表中进行选择。

从Test t SAMPLE(80)中选择WHERE t.test_id=01 and t.test_suite_id=02;

条件是动态的,我使用 queryDSL 生成它,但是我不知道如何添加 SAMPLE 关键字来查询 DSL。

public Long getCount(TestDTO testDTO) 
    JPAQuery<Tuple> query = new JPAQuery<>(entityManager);
    QTest qTest=QTest.test;
    //dynamic where condition.
    OptionalBooleanBuilder where = buildCondition(testDTO);
    
    List<BigDecimal> output=query
            .select(qTest.testId)
            .from(qTest)
            .where(where.build()).fetch();
   //finally return the output.

【问题讨论】:

【参考方案1】:

SAMPLE 是数据库方言特定功能,在 JPA 的查询语言 JPQL 中不可用。因此,您需要使用 ORM 实现为您的方言注册一个自定义函数。您可以使用custom functions 自己注册这些函数。

但是,在此之后,这些功能仍然无法在 QueryDSL 中访问。为此,您必须实现自定义Operation 实现并将其与JPQLTemplates 子类中的“模板”相关联。或者,您可以创建一个 TemplateExpression 内联:Expressions.template(Integer.class, "SAMPLE(0)", arg1)

【讨论】:

以上是关于如何使用 QueryDSL 在查询中使用 SAMPLE 关键字的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有域类的 querydsl 中构造查询

如何在 Querydsl 中创建子查询

如何使用 Querydsl 和 Spring Data 轻松实现“REST API 查询语言”来过滤实体?

如何从querydsl获得完全物化的查询

如何模拟querydsl查询?

如何使用 QueryDSL 在 Spring Data JPA 中使用 order by 和 Limit