【问题标题】:Spring boot Is it possible to group predicates or use 'in' conditionallySpring boot是否可以对谓词进行分组或有条件地使用'in'
【发布时间】:2018-08-15 07:12:43
【问题描述】:

我在使用 CriteriaBuilderPredicates 正确分组查询时遇到问题。

我想创建一个可以生成如下内容的查询:

SELECT * from tableName where columnA = '1234' and (columnB Like '%33%' or columnB Like '%44%')

但我得到的(显然是预期的代码)是:

SELECT * from tableName where columnA = '1234' and columnB Like '%33%' or columnB Like '%44%'

这不会产生与第一个查询相同的结果。

一直在尝试解决它,但这是我第一次使用标准构建器和谓词。 代码如下:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Foo> criteriaQuery = builder.createQuery(Foo.class);
Root r = criteriaQuery.from(Foo.class);
Predicate predicate = builder.conjunction();
for(Map.Entry<String, String> entry : searchParams.entrySet()){
    if((entry.getKey().equalsIgnoreCase("columnK") || entry.getKey().equalsIgnoreCase("columnY") ||
            entry.getKey().equalsIgnoreCase("columnZ") || entry.getKey().equalsIgnoreCase("columnJ")) && !Strings.isNullOrEmpty(entry.getValue())){
                        predicate = builder.and(predicate,
                    builder.like(r.get(entry.getKey()),
                            String.format("%%%s%%", entry.getValue().toString())));
    }
    else if(entry.getKey().equalsIgnoreCase("theDate") && !Strings.isNullOrEmpty(entry.getValue())){
        predicate = builder.and(predicate, builder.equal(r.get(entry.getKey()), entry.getValue()));
    }
}

//here's where the problem is ... I realize I can use IN, but I also didn't get that to work
boolean isFirstDone = false;
for(String oneId: idStringList){
    if(!isFirstDone) {
        predicate = builder.and(predicate, builder.equal(r.get("acceptorId"), oneId));
        isFirstDone = true;
    }
    else{
        predicate = builder.or(predicate, builder.equal(r.get("acceptorId"), oneId));
    }
}
criteriaQuery.where(predicate);

谢谢。

【问题讨论】:

    标签: java spring spring-boot criteria-api


    【解决方案1】:

    好的,所以我在仔细阅读了这个答案https://stackoverflow.com/a/9323183/5038073 后才破解了这个解决方案不是我所需要的,但它帮助了......很多

    我创建了一条路径并将其与我的谓词结合起来。

    变化如下:

    这个:

    boolean isFirstDone = false;
    for(String oneId: idStringList){
        if(!isFirstDone) {
            predicate = builder.and(predicate, builder.equal(r.get("acceptorId"), oneId));
            isFirstDone = true;
        }
        else{
            predicate = builder.or(predicate, builder.equal(r.get("acceptorId"), oneId));
        }
    }
    

    成为:

    Path<Object> path = r.get("acceptorId");
    CriteriaBuilder.In<Object> in = builder.in(path);
    for (String oneId: idStringList) {
        in.value(oneId);
    }
    predicate = builder.and(predicate, in);
    

    对于我解决的所有麻烦来说非常简单。

    希望这对其他人也有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-22
      • 2021-11-08
      • 2022-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多