Reputation: 144
I have following table
@Entity
@Table(name="resource")
public class Resource implements Serializable {
@javax.persistence.Id
@Column(name="resource_id")
private Long id;
private String name;
private String description;
@ManyToMany( fetch = FetchType.EAGER)
@JoinTable(name="resource_attribute_item", joinColumns = { @JoinColumn (name =
"resource_id")},
inverseJoinColumns = {@JoinColumn (name="attribute_item_id")})
private List<AttributeItem> attributeItems;
In my dao for this table, I have method find(Resources example)
where all the field that should be criterias or predicates to the query will be not null,
public List<Resource> find(Resource example) {
CriteriaBuilder cb = getCurrentSession().getCriteriaBuilder();
CriteriaQuery<Resource> criteriaQuery = cb.createQuery(Resource.class);
Root<Resource> root = criteriaQuery.from(Resource.class);
ArrayList<Predicate> predicates = new ArrayList<Predicate>();
if(example.getId()!= null)
predicates.add(cb.equal(root.get("id"),example.getId()));
if(example.getName()!= null)
predicates.add(cb.equal(root.get("name"),example.getName()));
if(example.getAttributeItems()!=null && example.getAttributeItems().size()!= 0)
// How do I implement
Predicate[] all = new Predicate[predicates.size()];
predicates.toArray(all);
criteriaQuery = criteriaQuery.where(all);
Query query = getCurrentSession().createQuery(criteriaQuery);
return query.getResultList();
}
The id and name fieds seem straightforward, I just do the following cb.equal(root.get("name"),example.getName())
but what about attributeItems which is many to many column
Thanks in advance
Upvotes: 0
Views: 1172
Reputation: 144
I ended up solving the issue in the following
public List<Resource> find(Resource example) {
CriteriaBuilder cb = getCurrentSession().getCriteriaBuilder();
CriteriaQuery<Resource> criteriaQuery = cb.createQuery(Resource.class);
Root<Resource> root = criteriaQuery.from(Resource.class);
ArrayList<Predicate> predicates = new ArrayList<Predicate>();
if(example.getId()!= null)
predicates.add(cb.equal(root.get("id"),example.getId()));
if(example.getName()!= null)
predicates.add(cb.equal(root.get("name"),example.getName()));
if(example.getAttributeItems()!=null && example.getAttributeItems().size()!= 0) {
Join<Resource,AttributeItem> attributesItemUsingJoin = root.join("attributeItems");
List<AttributeItem> attributeItems = example.getAttributeItems();
for(AttributeItem attribute : attributeItems) {
predicates.add(cb.equal(attributesItemUsingJoin.get("id"),attribute.getId()));
}
}
Predicate[] allPredicates = new Predicate[predicates.size()];
predicates.toArray(allPredicates);
criteriaQuery = criteriaQuery.where(allPredicates);
Query query = getCurrentSession().createQuery(criteriaQuery);
return query.getResultList();
}
Upvotes: 2