我有一个列表要附加到 or 条件
我面临的问题是当我迭代列表并将其添加到 CategoryBuilder 时,它会采用最后一个谓词
以下是示例:
public static Specification<Billoflading> hasTenantAndBillingCodeCombination(List<WhoOwnsIt> list,
Date formattedFromDate, Date formattedToDate, String carrierFilter, String supplierFilter,
String terminalFilter) {
return (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
for (WhoOwnsIt whoOwnsIt : list) {
String containsLikePatternForTenant = getContainsLikePattern(whoOwnsIt.getWholesalerTenantID(), true);
Predicate pred = cb.and(cb.like(cb.lower(root.<String>get("tenant")), containsLikePatternForTenant),
cb.equal(cb.lower(root.<String>get("billingCode")), whoOwnsIt.getBillingCode()),
cb.greaterThanOrEqualTo(root.<Date>get("scheduleDate"), formattedFromDate),
cb.lessThanOrEqualTo(root.<Date>get("scheduleDate"), formattedToDate));
Predicate predWithTenant = null;
if (null != carrierFilter) {
predWithTenant = cb.and(cb.equal(cb.lower(root.<String>get("tenant")), carrierFilter));
}
if (null != predWithTenant)
predicates.add(predWithTenant);
else
predicates.add(pred);
}
Predicate finalPredicate;
// This commented section below needs to be replaced with a
//better solution
//for(Predicate predicate : predicates){
// cb.or(predicate);
//}
return finalPredicate;
};
}
我还尝试将 List 设为数组,以便将其传递给 FinalPredicate.or ,如下所示
Predicate finalQuery = cb.or(predicates.toArray());
但是这段代码给出了编译错误,因为所需的参数是 varargs 即
or 方法接受 (Predicate...predicates) 作为参数列表
您能为这个问题提供一些简单的解决方案吗?
试试这个:
Predicate finalQuery = cb.or(predicates.toArray(new Predicate[0]));
作为补充,我建议对较新的 Java 版本使用以下表示法:
builder.or(predicates.toArray(Predicate[]::new))
我编写的示例代码可能会有所帮助。在这里,我将所有谓词收集在一个列表中,然后将该列表转换为一个由构建器使用的数组。
public List< EntityClass> getData(List<Long> ids) {
List<List<Long>> idPartitions = ListUtils.partition(ids, 999);
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<EntityClass> criteria = builder.createQuery(EntityClass.class);
Root<EntityClass> root = criteria.from(EntityClass.class);
List<Predicate> predicates = new ArrayList<>(idPartitions.size());
for (List<Long> idPartition : idPartitions) {
predicates.add(root.get("id").in(idPartition));
}
criteria.where(builder.and(predicates.toArray(new Predicate[0])));
List<EntityClass> objects = entityManager.createQuery(criteria).getResultList();
return objects;
}