如何通过给定的java布尔值添加条件谓词?

时间:2016-07-08 02:28:40

标签: jpa criteria-api

我有一个应该有条件地添加谓词的业务方法。

public <T extends BaseEntity, Y> T findEntityByUniqueAttribute(
        final Class<T> entityType,
        final Supplier<SingularAttribute<? super T, Y>> attributeSupplier,
        final Supplier<? extends Y> valueSupplier,
        final boolean filterDeleted) {
    return applyWithPersistenceContext(manager -> {
        final CriteriaBuilder builder = manager.getCriteriaBuilder();
        final CriteriaQuery<T> criteria
                = builder.createQuery(entityType);
        final Root<T> from = criteria.from(entityType);
        criteria.select(from);
        criteria.where(builder.equal(from.get(attributeSupplier.get()),
                                     valueSupplier.get()));
        final TypedQuery<T> query = manager.createQuery(criteria);
        try {
            return Optional.of(query.getSingleResult())
                    .filter(result -> !filterDeleted
                                      || result.getDeleted() != null)
                    .orElse(null);
        } catch (final NoResultException nre) {
            return null;
        }
    });
}

正如您所看到的,此方法可以进行提取和检查。 现在我相信我可以通过在查询本身中添加后置过滤器(!filterDeleted || result.getDeleted() != null)来改进这一点。

我该怎么做?

到目前为止,我做到了这一点。

        final List<Predicate> predicates = new ArrayList<>(2);
        predicates.add(builder.equal(from.get(attributeSupplier.get()),
                                     valueSupplier.get()));
        if (filterDeleted) {
            predicates.add(builder.isNull(from.get(BaseEntity_.deleted)));
        }
        criteria.where(predicates.toArray(new Predicate[predicates.size()]));
        final TypedQuery<T> query = manager.createQuery(criteria);
        try {
            return query.getSingleResult();
        } catch (final NoResultException nre) {
            return null;
        }

有没有办法让Predicate给定filterDeleted

1 个答案:

答案 0 :(得分:0)

您可以将布尔参数的谓词创建为假如此

ParameterExpression<Boolean> param = builder.parameter(Boolean.class, "myParam");
Predicate paramFalse = builder.isFalse(param);

然后以正常方式将参数设置为查询的输入。