I have a many-to-many relationship:
Code:
@Entity
@Table(name = "ITEM")
class Item {
// Some properties...
private String name;
private Set<Category> categoryCollection = new HashSet<Category>(0);
// Some getters and setters
@ManyToMany
@JoinTable(name = "ITEM_CATEGORY", joinColumns = {
@JoinColumn(name = "ITEM_ID",
nullable = false, updatable = false) },
inverseJoinColumns = {
@JoinColumn(name = "CATEGORY_ID",
nullable = false, updatable = false) })
public Set<Category> getCategoryCollection() {
return categoryCollection;
}
public String getName() {
return name;
}
}
@Entity
@Table(name = "CATEGORY")
class Category {
// Some properties...
private String name;
private Set<Item> itemCollection = new HashSet<Item>(0);
// Some getters and setters
@ManyToMany(mappedBy = "categoryCollection")
public Set<Item> getItemCollection() {
return itemCollection;
}
public String getName() {
return name;
}
}
In my ItemDao class, i need to build a criteria: find items associated to a category (by name).
Code:
class ItemDao extends SpringHibernateDao<Item> {
// ...
public PagedList<Item> findByFilter(ItemFilter filter,
Pagination pagination) {
DetachedCriteria crit = DetachedCriteria.forClass(Item.class);
Disjunction disjunction = Restrictions.disjunction();
if (filter.getName() != null) {
disjunction.add(Restrictions.eq("name", filter.getName())
.ignoreCase());
}
if (filger.getCategoryName() != null {
// TODO: Need to add a disjunction restriction here.
}
// ...
}
}
There are some alternatives that cannot be included in a disjunction restriction, like above:
Code:
DetachedCriteria dc = crit.createCriteria("categoryCollection");
dc.add(Restrictions.eq("name", filter.getCategoryName()).ignoreCase());
I found a solution but created a second DetachedCriteria for Item class:
Code:
DetachedCriteria dcItem = DetachedCriteria.forClass(Item.class, "i");
DetachedCriteria dcCategory = dcItem.createAlias("categoryCollection", "c");
dcCategory.add(Restrictions.eq("c.name", filter.getCategoryName()).ignoreCase());
dcCategory.setProjection(Projections.property("i.id"));
disjunction.add(Subqueries.propertyIn("id", dcCategory));
I think it's not a good solution. Anybody could show me a better solution?
Thanks