2016-07-08 6 views
0

条件付きで述語を追加するビジネスメソッドがあります。条件付き述語をjavaブール値で追加するにはどうすればよいですか?

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; 
     } 

与えfilterDeletedPredicateを作るための方法はありますか?

+0

なぜ「deleted == null」と同等の処理をしていますか? "deleted == false"で成功する可能性がより高い –

+0

@NeilStockton私の 'deleted'のタイプは' TIMESTAMP'です。 –

+0

あなたが話しているブーレーンとは何ですか?それはFALSEと比較する必要があります。あなたの(省略した)クラスを置いていれば、これはもっとはっきりしていただろう。 –

答えて

0

あなたは

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

このような虚偽であるとしてブール・パラメータのための述語を作成し、通常の方法でクエリへの入力としてパラメータを設定することができます。

関連する問題