0

私は JPA を使用しており、指定された親 ( )Productのすべての子エンティティ ( )を選択しようとしています。関係はです。likeを作成せずに、1 つのクエリに抑えたいと思います。ListCategoryCategory OneToMany ProductPredicateproduct.get("category") == category.get(0) || product.get("category") == category.get(1) || ...

次のコードを試してみましたが、うまくいかないようです (一番下のスタックに見られるように)。これを達成する方法について誰か提案がありますか?

コード

public List<Product> findProductsBy(List<Category> categories) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Product> query = cb.createQuery(Product.class);
    Root product = query.from(Product.class);
    Predicate predicateCategory = product.get("category").in(categories);

    query.select(product).where(predicateCategory);
    return em.createQuery(query).getResultList();
}

スタック

WARNING: Local Exception Stack: 
Exception [EclipseLink-6075] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException
Exception Description: Object comparisons can only use the equal() or notEqual() operators.  Other comparisons must be done through query keys or direct attribute level comparisons. 
Expression: [
Relation operator [ IN ]
   Query Key category
      Base (...).Product
4

1 に答える 1

0

あなたができることは、カテゴリオブジェクトの代わりにカテゴリIDを使用することです(エラー状態として:オブジェクト比較はサポートされていません):

(カテゴリ ID が であると仮定するとLong、次のことができます。)

public List<Product> findProductsBy(List<Category> categories) {
    List<Long> categoryIds = new ArrayList<Long>();
    for(Category category:categories){
        categoryIds.add(category.getId());
    }
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Product> query = cb.createQuery(Product.class);
    Root product = query.from(Product.class);
    Predicate predicateCategory = product.get("categoryId").in(categoryIds);

    query.select(product).where(predicateCategory);
    return em.createQuery(query).getResultList();

}

于 2013-02-01T14:31:56.003 に答える