Я изо всех сил пытаюсь создать запрос, используя Criteria API.Следующий SQL-запрос возвращает результат, который мне нужен:
SELECT * FROM MODEL WHERE MANUFACTURER_ID = 1 AND SHORTNAME LIKE '%SF%' OR LONGNAME LIKE '%SF%';
Я написал следующий код с использованием API критериев:
public List<Model> findAllByManufacturer(Manufacturer manufacturer,
String pattern) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Model> cq = cb.createQuery(Model.class);
Root<Model> m = cq.from(Model.class);
cq.select(m);
Join<Model, Manufacturer> mf = m.join("manufacturer");
Predicate p = cb.equal(mf.get("id"), manufacturer.getId());
p = cb.and(cb.like(cb.upper(m.<String>get("shortName")),
pattern.toUpperCase()));
p = cb.or(cb.equal(cb.upper(m.<String>get("longName")),
pattern.toUpperCase()));
cq.where(p);
return em.createQuery(cq).getResultList();
}
Когда я думаю об этом логически, он должен работать:
Predicate p = cb.equal(mf.get("id"), manufacturer.getId());
WHERE MANUFACTURER_ID = 1
p = cb.and(cb.like(cb.upper(m.<String>get("shortName")),
pattern.toUpperCase()));
И ИМЯ SHORTNAME '% SF%'
p = cb.or(cb.equal(cb.upper(m.<String>get("longName")),
pattern.toUpperCase()));
ИЛИ LONGNAME LIKE '% SF%'
Запрос выполняется правильно, я не получаю никаких ошибок, он просто не возвращает никаких результатов.Любая подсказка, где я ошибся, очень ценится!