Ich habe eine Geschäftsmethode, die ein Prädikat bedingt hinzufügen sollte.Wie kann ich bedingte Prädikate durch gegebenen Java Boolean hinzufügen?
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;
}
});
}
Wie Sie diese Methode sehen kann nicht abrufen und überprüfen. Jetzt glaube ich, dass ich das verbessern kann, indem ich den Nachfilter (!filterDeleted || result.getDeleted() != null
) in die Abfrage selbst hinzufüge.
Wie kann ich es tun?
Bisher habe ich das getan.
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;
}
Gibt es eine Möglichkeit, eine Predicate
mit bestimmten filterDeleted
zu machen?
Warum machst du das Äquivalent von "deleted == null"? Bessere Chance auf Erfolg mit "deleted == false" –
@NeilStockton mein 'deleted's Typ ist' TIMESTAMP'. –
Also worüber spricht der BOOLEAN? Das muss mit FALSE verglichen werden. Hättest du deine (abgekürzten) Klassen gesetzt, wäre das klarer gewesen. –