Я использую API критериев JPA для извлечения записей из базы дат. У меня есть объект Запись с полем dateTime который может быть пустым. Я бы назвал код:Порядок API API JPA по NULL последний
public List<Record> find(RecordFilter recordFilter, int page, int pageSize) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Record> criteriaQuery = criteriaBuilder.createQuery(Record.class);
Root<Record> recordRoot = criteriaQuery.from(Record.class);
/*
* JOINS. Left Joins are used for optional fields, or fields inside of the optional fields.
*/
Join<Record, Agency> recordAgencyJoin = recordRoot.join(RecordTable.FIELD_AGENCY);
//Some other joins
//This is where I had the problem.
applyOrderBy(criteriaQuery, criteriaBuilder, recordRoot);
/*
* Specify which columns to select and their order.
* criteriaQuery.multiselect(....);
*/
applyMultiSelect(recordRoot, recordAgencyJoin, /*other joins*/ criteriaQuery);
/*
* criteriaQuery.where(somePredicate);
*/
applyFilter(recordFilter, criteriaQuery, criteriaBuilder,
recordRoot, recordAgencyJoin /*, other joins*/);
TypedQuery<Record> query = entityManager.<Record>createQuery(criteriaQuery);
RepositoryUtils.applyPagination(query, page, pageSize);
return query.getResultList();
}
private void applyOrderBy(CriteriaBuilder criteriaBuilder, Root<Record> recordRoot, CriteriaQuery<Record> criteriaQuery) {
//Other fields to be added to the final sort.
Order dateTimeDescOrder = criteriaBuilder.desc(recordRoot.get(RecordTable.FIELD_DATE_TIME));
criteriaQuery.orderBy(dateTimeDescOrder /*, other orders by*/);
}
Оказалось, сначала отображаются записи с NULL dateTimeField. Я использую базу данных Postggres. Я отвечу на этот вопрос, потому что нашел решение. Вот аналогичный пост. JPA Criteria Query API and order by null last
Я пробовал это и получил «ERROR: COALESCE» временную метку без часового пояса, а bytea нельзя сопоставить ». Может иметь какое-то отношение к конкретному способу построения cb: 'cb.coalesce (root.get ('joinModel'). Get ('someDate'), MIN_DATE)' –
Действительно? Он работал в моем коде. Проверьте версию спящего режима, MIN_DATE. Также я использовал метод соединения вместо того, чтобы перемещаться по отношениям сущностей recordRoot = externalRoot.jolin ("recordRelation"); Тогда recordRoot.get ("field") –
Обнаружена первопричина. Я использовал «LocalDateTime» в отличие от даты. В DB Postgres это не работает. Переключился на 'Date', как указано в ответе. –