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 ?
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()));
}