【问题标题】:Spring Data + QueryDSL empty predicate + Predicate chainingSpring Data + QueryDSL 空谓词 + 谓词链接
【发布时间】:2015-01-21 07:07:10
【问题描述】:

让我直奔主题。 我在一个项目中使用 Spring Data JPA 和 QueryDSL,我自己无法弄清楚。

我在可以接受参数的静态方法中有 QueryDSL 谓词,如果参数不正确,它应该返回“空谓词”:

public static BooleanExpression byWhateverId(Long whateverId) {
  if(whateverId == null) return [insert magic here];
  // if parameter is OK return usual predicate
  return QClass.property.whateverId.eq(whateverId);
}

现在我希望能够使用 AND/OR 运算符链接这些谓词:

someRepository.findAll(byWhateverId(someParam).and(bySomethingElseId(1));

这里的问题是,此时我不知道 'someParam' 是否为空(当然我可以检查,但这是很多 IF)。 我也知道我可以使用 BooleanBuilder 类,但这似乎也有很多不需要的代码。

有谁知道可以插入什么而不是“[在此处插入魔法]”??? 或者,也许我在某处遗漏了什么......

谢谢!

【问题讨论】:

    标签: spring predicate querydsl


    【解决方案1】:

    您可以为byWhateverIdbySomethingElseId 中不匹配的谓词返回null,并通过ExpressionUtils.allOf() 组合谓词

    你的情况

    Predicate where = ExpressionUtils.allOf(byWhateverId(someParam), bySomethingElseId(1));
    someRepository.findAll(where);
    

    【讨论】:

    • 感谢您的回复。这看起来很不错,但我仍然想在没有任何额外成本的情况下进行链接(比如使用 ExpressionUtils)。这个解决方案与 BooleanBuilder 基本相同。我真的很喜欢 byWhateverId(1).and(bySomethingElseId(1)) 的方式。但也许我在这件事上太严格了,我应该接受这个:)
    【解决方案2】:

    4 岁的问题,但无论如何......

    您可以返回始终为 true 的 sql 谓词,例如 true=true:

    public static BooleanExpression alwaysTrue() {
        return Expressions.asBoolean(true).isTrue();
    }
    

    如果你有一堆这样的生成的 sql 不会很好,所以你可能希望将这些用法限制在最低限度。

    【讨论】:

      【解决方案3】:

      对不起,我完全忘记了这一点。 正确的解决方案(从我的角度来看)是使用BooleanBuilder

      【讨论】:

        猜你喜欢
        • 2016-01-08
        • 1970-01-01
        • 2018-04-06
        • 2016-08-04
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        • 2019-02-02
        • 1970-01-01
        相关资源
        最近更新 更多