2012-02-12 51 views
0

我有兩個類在多對多的關係,但只有一個有另一個列表。休眠noob:提取沒有映射關係的條件

@Entity 
public class Product{ 
    @ManyToMany 
    List<Category> categories; 
    //... 
} 

@Entity 
public class Category{ 
    //... 
} 

我想使用標準查找與某個類別相關的所有產品,但以下不起作用。

import static java.util.Collections.singletonList; 

List<Product> getProductsByCategory(Category category){ 
    List<Product> results = getCurrentSession() 
          .createCriteria(Product.class) 
          .add(Restrictions.in("categories", singletonList(category))) 
          .list(); 
    if (results == null || results.size() <= 0) 
     throw new EntityNotFoundException(category + "is empty"); 
    return results; 
} 

當然,這將是非常簡單的,如果產品被映射到類別,但肯定休眠讓你做這樣的查詢沒有它。

編輯:

它返回一個Oracle錯誤

Caused by: java.sql.SQLException: Missing IN or OUT parameter at index:: 1 

感謝您的幫助!

+0

你有沒有得到任何錯誤,或者它只是沒有返回預期的結果?如果錯誤,什麼錯誤? – yair 2012-02-12 08:59:22

回答

2
Criteria c = session.createCriteria(Product.class, "product"); 
c.createAlias("product.categories", "category"); 
c.add(Restrictions.eq("category.id", category.getId()); 
List<Product> results = c.list(); 

注意:結果列表永遠不會爲空。它的大小永遠不會是< 0.如果類別沒有任何產品,則空列表是正確的。在這種情況下,我不會拋出異常。

+0

我沒有做我的功課,完全忽略了createAlias()。非常感謝! 關於測試,它來自一本書中的例子(_Spring Persistence with Hibernate_),但我覺得使用它很尷尬......很高興知道查詢從不返回奇怪的東西。 – 2012-02-14 11:43:17

0
List<Product> results = getCurrentSession().createCriteria(Product.class) 
         .createCriteria("categories") 
          .add(Restrictions.in("id", uniqueIds(categories))) 
         .list();