@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 нужно реализовать метод, который будет принимать в качестве аргумента коллекцию FilterCriterion и возвращать коллекцию Item, такую, чтобы у каждого Item в этой коллекции, коллекция FilterCriterion содержала все элементы коллекции, данной в качестве аргумента. При такой реализации:
@Override 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(); }
в результат попадают все Item, у которых хотя бы один FilterCriterion имеется в коллекции, данной в качестве аргумента. Если
criteria.add(Restrictions.in("f.filterCriterionId", currentFilterCriteriaId));
заменить на
for(Integer currentId : currentFilterCriteriaId){ criteria.add(Restrictions.eq("f.filterCriterionId", currentId)); }
результат все равно неверный. Как правильно сформировать criteria, чтобы в результате получить только те Item, коллекции FilterCriterion которых содержат все элементы данной в качестве аргумента коллекции FilterCriterion?