Создание предиката для последнего значения даты

Мне нужно создать предикат для извлечения данных из таблицы, где regId = ? (||) or (&&) estCode = ? && latest (referralEntryDate)

получить данные за последнюю дату

@Override
public Predicate toPredicate(Root<ReviewMedicalStatus> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

    List<Predicate> predicatesReg = new ArrayList<Predicate>();

    if (revStatusDto.getRegId() != null && !StringUtils.isEmpty(revStatusDto.getRegId())) {
        predicatesReg.add(cb.equal(root.get("regId"), revStatusDto.getRegId()));
    }
    if (revStatusDto.getEstCode() != null && !StringUtils.isEmpty(revStatusDto.getEstCode())) {
        predicatesReg.add(cb.equal(root.get("estCode"), revStatusDto.getEstCode()));
    }

    Expression maxExpression = cb.max(root.get("referralEntryDate"));
    predicatesReg.add(maxExpression);
    //predicatesReg.add(cb.max(root.get("referralEntryDate")));
    return cb.and(predicatesReg.toArray(new Predicate[predicatesReg.size()]));
}

Это не удается, поскольку выражение не может быть передано в качестве параметра для предиката. Как я могу получить данные за последний referralEntryDate?


person user630209    schedule 07.03.2016    source источник


Ответы (1)


Вместо max вы должны использовать greatest для дат. Максимум для Numeric типов. Чтобы поместить его в предикат, вам нужно сделать из него подзапрос. Ссылка: Критерии JPA выбирают все экземпляры с максимальными значениями в своих группах. Это не совсем ваш набор сущностей, но он должен дать вам представление:

CriteriaBuilder cb = em.getCriteriaBuilder();
// make main query for Content
CriteriaQuery<Content> q = cb.createQuery(Content.class);
Root<Content> c = q.from(Content.class);

// make subquery for date
Subquery<Date> sq = q.subquery(Date.class);
Root<Content> c2 = sq.from(Content.class);

// get the max date in the subquery
sq.select(cb.greatest(c2.<Date>get("date")));

// make a predicate out of the subquery
Predicate p = cb.equal(c.get("date"), sq);

// assign predicate to the main query
q.where(p);        

// and get the results
Content r = em.createQuery(q).getSingleResult();
System.out.println(r);
person K.Nicholas    schedule 08.03.2016