【问题标题】:QueryDsl BooleanBuilder: How to create a predicate that compares another field?QueryDsl BooleanBuilder:如何创建一个比较另一个字段的谓词?
【发布时间】:2016-07-12 20:16:49
【问题描述】:

我有一个简单的例子:查找所有已售罄的商品。

Item 具有 initialQuantity 和 soldQuantity 整数字段。 (出于某种原因,我需要存储初始数量)

我正在尝试做类似的事情:

builder = new BooleanBuilder();
Predicate predicate = builder.and(item.initialQuantity.eq(item.soldQuantity)).getValue();
Iterable<Item> iterable = itemRepository.findAll(predicate);

但它没有按预期返回。 “.eq()” 看起来需要一个整数而不是 Path

【问题讨论】:

  • 变量项是什么类型的?它是生成的 Q* 类吗?如果是,请显示对应数据库表的规格(我假设名称是item)。
  • 是的,有 QItem。如果我使用 .eq(10) 或其他东西,这个查询就可以正常工作,但我想与表中的另一列进行比较,我该怎么做?
  • 如果 initialQuantitysoldQuantity 的类型为 com.querydsl.core.types.dsl.NumberPath 它应该可以工作。如果没有更多信息(错误、代码、数据库方案),这个问题没有意义。
  • 所以没有错误,我只是没有得到我期望得到的值。我什至尝试了 builder.and(item.initialQuantity.eq(item.initialQuantity)) ,它应该始终返回 true,但使用此查询不会返回任何内容...
  • builder.and(item.initialQuantity.eq(item.initialQuantity))这只是您查询的一部分...其余的是什么?

标签: java sql querydsl boolean-expression


【解决方案1】:

先声明一下:

JPAQueryFactory query = new JPAQueryFactory(em);
BooleanBuilder booleanBuilder = new BooleanBuilder();
QCreditRequest creditRequest = QCreditRequest.creditRequest;

然后,您可以包含您的业务逻辑,例如:

booleanBuilder.and(creditRequest.creditRequestId.eq(dataRequest.getCreditRequestId()));

if (StringUtils.isNotBlank(dataRequest.getProductId())){
                 booleanBuilder.and(creditRequest.product.productId.eq(dataRequest.getProductId()));}

最终返回结果,映射到你的 DTO:

return new HashSet<>(
            query
                .select(
                    Projections.constructor(
                        APResponse.class,
                        creditRequest.creditRequestId,
                        creditRequest.creditRequestDate,
                        creditRequest.product.productId,
                        creditRequest.creditRequestComment))
                .from(creditRequest)
                .innerJoin(creditRequest.product, product)
                .innerJoin(creditRequest.status, creditRequestStatus)
                .where(booleanBuilder)
                .fetch());

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多