Я изучаю JPA Criteria API. Я нашел несколько примеров применения ограничений к сущности, использующей предикаты, а также по отдельности при использовании методов агрегирования. Мне нужен пример использования агрегатных методов после применения предикатов к CriteriaQuery.
@ samabcde Спасибо за быстрый комментарий.
У меня есть класс, представляющий деревянные шкафы.
public class Cabinet {
private int id;
private String style;
private String wood;
// number of drawers
private int drawers;
// getters and setters
}
Я загрузил дамп из базы данных. https://gofile.io/?c=w8Km9j
Пока я могу выбрать все шкафы
public List<Cabinet> findAll() {
[...] //suppressed
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Cabinet> crt = cb.createQuery(Cabinet.class);
Root<Cabinet> root = crt.from(Cabinet.class)
crt.select(root);
Query query = session.createQuery(crt);
List<Cabinet> cabinetsList = query.getResultList();
[...]
return cabinetsList;
}
или выбрать шкафы по стилю и типу дерева.
public List<Cabinet> findCabinetsByStyleAndWood(String style, String wood) {
[...]
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Cabinet> crt = cb.createQuery(Cabinet.class);
Root<Cabinet> root = crt.from(Cabinet.class);
crt.select(root);
Predicate cabStyle = cb.equal(root.get("style"), style);
Predicate cabWood = cb.equal(root.get("wood"), wood);
crt.where(cabStyle, cabWood);
Query query = session.createQuery(crt);
List<Cabinet> cabinetsList = query.getResultList();
[...]
return cabinetsList;
}
Я пытался выбрать максимальное количество ящиков,
public Integer findMaxNumOfDrawers() {
[...]
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Integer> crt = cb.createQuery(Integer.class);
Root<Cabinet> root = crt.from(Cabinet.class);
crt.select(cb.max(root.get("drawers")));
Query query = session.createQuery(crt);
Integer result = (Integer) query.getSingleResult();
[...]
return result;
}
, но этот код не работает. На самом деле я пытался адаптировать этот код. Но я не могу понять, что это логика c.
Я также собираюсь выбрать кабину inet по стилю и типу дерева с максимальным количеством ящиков.
public Cabinet findCabinetByStyleAndWoodMaxNumOfDrawers(String style, String wood) {
...
return cabinet;
}
Я хотел бы получить список шкафов с наибольшим количеством ящиков для каждого стиля и типа дерева
public List<Cabinet> findCabinetsByStyleAndWoodMaxNumOfDrawers() {
....
return cabinetsList;
}
TIA.