【发布时间】:2014-01-28 15:44:04
【问题描述】:
我有两个具有多对多关系的实体:
@Entity
@Table(name = "items")
public class Item implements Comparable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "item_id")
private Integer itemId;
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "items_criteria",
joinColumns = @JoinColumn(name = "item_id"),
inverseJoinColumns = @JoinColumn(name = "filter_criterion_id"))
private List<FilterCriterion> filterCriteria;
}
和
@Entity
@Table(name = "filter_criteria")
public class FilterCriterion {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "filter_criterion_id")
private Integer filterCriterionId;
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "items_criteria",
joinColumns = @JoinColumn(name = "filter_criterion_id"),
inverseJoinColumns = @JoinColumn(name = "item_id"))
private List<Item> items;
}
我需要在 ItemDao 类中编写函数,该函数返回将集合的所有元素作为参数给出的项目列表。在下面的示例中,我使用 Restrictions.in,因此结果甚至包含那些仅包含 List 中作为参数给出的一个 FilterCriterion 的项目。我只需要在结果中包含那些包含参数列表中所有元素的项目。
public List<Item> getItems(List<FilterCriterion> currentFilterCriteria) {
Criteria criteria = ht.getSessionFactory().getCurrentSession().createCriteria(Item.class);
List<Integer>currentFilterCriteriaId = new ArrayList<Integer>();
for(FilterCriterion criterion : currentFilterCriteria){
currentFilterCriteriaId.add(criterion.getFilterCriterionId());
}
if(!currentFilterCriteriaId.isEmpty()){
criteria.createAlias("filterCriteria", "f");
criteria.add(Restrictions.in("f.filterCriterionId", currentFilterCriteriaId));
}
return criteria.list();
}
【问题讨论】:
标签: java hibernate many-to-many criteria