2016-03-07 8 views
0

Мне нужно создать предикат для извлечения данных из таблицы, где 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?

ответ

0

Вместо max вы должны использовать greatest для дат. Макс - для моделей Numeric. Чтобы поместить его в предикат, вам нужно сделать из него подзапрос. Ссылка: JPA Criteria select all instances with max values in their groups. Это не совсем ваш набор сущностей, но он должен дать вам идею:

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); 

 Смежные вопросы

  • Нет связанных вопросов^_^