JPA - как использовать предикаты + методы агрегации? - PullRequest
0 голосов
/ 17 января 2020

Я изучаю 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.

...