【问题标题】:Java JPA: Select 'ATTRIBUTE is in List<>'Java JPA:选择“属性在列表<>中”
【发布时间】:2013-02-01 12:38:45
【问题描述】:

我正在使用 JPA 并尝试选择父母 (Category) 的给定 List 的所有子实体 (Product)。关系是Category OneToMany Product。我想将其保留为一个查询,而不是像 product.get("category") == category.get(0) || product.get("category") == category.get(1) || ... 这样创建 Predicate

我尝试了以下代码,但这似乎不起作用(如底部的堆栈所示)。有没有人对如何实现这一点提出建议?

代码

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

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

    你可以做的是使用类别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();
    

    }

    【讨论】:

    • 我现在确实在尝试按 ID 进行比较,一旦我确认这有效,我会尽快提供更新。
    • 你也可以试试2.4,我觉得现在支持了。
    猜你喜欢
    • 2018-05-26
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多