yla-dev
yla-dev

Reputation: 144

JPA criteria API / hibernate CriteriaQuery on a many to many column

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

Answers (1)

yla-dev
yla-dev

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

Related Questions