dawidklos
dawidklos

Reputation: 922

Hibernate criteria with collections

Tags contains tag with field name with value "#tylkoclara". In first case results has size 1 which is expected result

SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.openSession();
        session.beginTransaction();
        List<Tag> results = new ArrayList<Tag>();
        Criteria criteria = session.createCriteria(Tag.class);
        criteria.add(Restrictions.eq("name", "#tylkoclara"));
        results = criteria.list();I

But if I try to use whole collection as criteria, result's size is 0

public static List<Tag> filterTags(List<Tag> tags) {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.openSession();
        session.beginTransaction();
        Criteria criteria = session.createCriteria(Tag.class);
        List<Tag> results = new ArrayList<Tag>();
        for(Tag tag : tags) {
            criteria.add(Restrictions.eq("name", tag.getName()));
        }
        results = criteria.list();

I have no ideas why is that happening

Upvotes: 1

Views: 94

Answers (1)

Bohuslav Burghardt
Bohuslav Burghardt

Reputation: 34856

By adding your Restrictions in a loop like this, you are creating AND condition instead of OR condition. And since no tag has multiple different names, 0 results will be returned.

You need to create OR condition, for example like this (I've omitted the parts of your code dealing with session creation, etc to keep the example shorter):

public List<Tag> filterTags(List<Tag> tags) {
    Criteria criteria = session.createCriteria(Tag.class);
    Disjunction disjunction = Restrictions.disjunction();

    for (Tag tag : tags) {
        disjunction.add(Restrictions.eq("name", tag.getName()));
    }
    criteria.add(disjunction);
    return criteria.list();
}

Upvotes: 1

Related Questions