2

違いは何ですか:

  • criteriaBuilder.in(述語);
  • criteriaQuery.where(述語);

これは同じ結果をもたらすようです。何か不足していますか?クエリの上にビルダーを選択する必要がありますか?

完全な例:

List<String> names = new ArrayList<String>();
names.add("John");
names.add("Emma");

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<PersonEntity> criteriaQuery = criteriaBuilder.createQuery(PersonEntity.class);
Root<PersonEntity> root = criteriaQuery.from(PersonEntity.class);

Predicate predicate = root.get(PersonEntity_.name).in(names);
criteriaBuilder.in(predicate);
// or alternative: criteriaQuery.where(predicate);

List<PersonEntity> list = entityManager.createQuery(cq).getResultList();
4

1 に答える 1

2

criteriaBuilder.in(predicate) は、新しい述語を作成します。プロバイダーがクエリに述語を追加している場合は、移植性がないため、プロバイダーにバグを報告する必要があります。仕様によると、root.get(PersonEntity_.name).in(names) と同様に、新しい述語を作成します。クエリは、criteriaQuery.where(predicate) を呼び出すなどして述語が追加された場合にのみ、述語を使用する必要があります。

于 2014-01-27T15:34:12.633 に答える