2015-03-03 58 views
0

我使用Hibernate的4和JSF 2Hibernate的一個一對多匹配多個ID

考慮下面的映射

@Entity 
@Table(name = "feature") 
public class Feature 
{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column 
    private String name; 

} 

@Entity 
@Table(name = "product") 
public class Product 
{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column 
    private String name; 

    @OneToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "product_feature", joinColumns = @JoinColumn(name = "product_id"), inverseJoinColumns = @JoinColumn(name = "feature_id")) 
    private Set<Feature> features = new HashSet<Feature>(0); 

} 

數據庫結構

Product 
--------- 
id 
name 

Feature 
--------- 
id 
name 

Product_Feature 
---------------- 
product_id 
feature_id 

我想要做什麼現在,構建一個DetachedCriteria以獲得所有具有的產品,比如1,2和3的特徵。不僅僅是其中的一個,而是所有的產品。

我只是不能得到限制的權利,找到產品匹配所有給定的功能,而不僅僅是一個。

DetachedCriteria criteria = DetachedCriteria.for(Product.class, "product"); 
criteria.createAlias("product.features", "feature"); 

我很感激任何幫助。提前致謝。

+0

它可能使用'限制': http://stackoverflow.com/a/3227273/1029758 – ccarc 2015-03-03 10:33:55

+0

如下所述,這隻能確保產品具有一個定義的特徵,但不能確保它具有所有定義的功能。 – kevcodez 2015-03-03 11:03:41

回答

0

我通過添加下面的sql限制來修復它。

String features = "1,4,5"; 
int featureSize = 3; 

DetachedCriteria criteria = DetachedCriteria.for(Product.class, "product"); 

criteria.add(Restrictions.sqlRestriction(String.format("(SELECT COUNT(*) FROM product_feature pf where pf.feature_id in(%s) and pf.product_id={alias}.id)=%d", features, featureSize))); 

這確保了產品具有所有三個功能,不僅有一個或兩個功能。