Search code examples
javahibernatecriteria

Search by multiple criteria or single fail


I created a criteria object to filter search and I want to be free to combine fields or not. For example search by serial number or search by ip adress or both

Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Device.class);

    if (device.getSerialNumber() != null) {
        criteria.add(Restrictions.like("serialNumber", device.getSerialNumber()));
    }
    if (device.getIpAdress() != null)
    {
        criteria.add(Restrictions.like("ipAdress", device.getIpAdress()));
    }

Here I have a result just if I fill both. Do you have any idea ?


Solution

  • If you add Criterions to your criteria, they are ANDed in SQL. To be able to handle the situation you can add an if clause:

    if (device.getSerialNumber() != null && device.getSerialNumber().trim().length > 0 
         && device.getIpAddress() != null && device.getIpAddress().trim().length > 0 ) {
            criteria.add(Restrictions.or(
                  Restrictions.like("serialNumber", device.getSerialNumber()),
                  Restrictions.like("ipAdress", device.getIpAdress()));
    } else if (device.getIpAddress() != null && device.getIpAddress().trim().length > 0 ) {
        criteria.add(Restrictions.like("ipAdress", device.getIpAdress()));
    } else if (device.getSerialNumber() != null && device.getSerialNumber().trim().length > 0 ) {
      criteria.add(Restrictions.like("serialNumber", device.getSerialNumber()));
     }