2012-02-12 3 views
0

多対多リレーションシップでは2つのクラスがありますが、どちらか一方だけにリストがあります。Hibernate 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; 
} 

EDIT:

これは、Oracleエラーに任意の助け

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

感謝を返します!

+0

エラーが発生しましたか、予期した結果が返されませんでしたか?エラーの場合、どのようなエラー? – yair

答えて

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(); 

注:結果リストは決してnullになりません。そしてそのサイズは決して<になりません。カテゴリに製品がない場合、空のリストが返されます。私はこの場合例外を投げていません。

+0

私は宿題をしておらず、createAlias()を完全に無視しました。本当にありがとう! テスト(Hibernate_ _Spring Persistence)のサンプルから来ましたが、私はそれを使用するのが面倒です...クエリが奇妙なものを返すことはないことを知っていれば嬉しいです。 –

0
List<Product> results = getCurrentSession().createCriteria(Product.class) 
         .createCriteria("categories") 
          .add(Restrictions.in("id", uniqueIds(categories))) 
         .list(); 
関連する問題