Есть сущность протокол
public class Protocol extends BaseLongIdEntity {
@Column(name = "NUMBER_")
@NotNull
private Long number;
@Column(name = "ISSUE_DATE")
@NotNull
private LocalDate issueDate = LocalDate.now();
}
Есть некий экран с таблицей (где все эти протоколы отображаются) с некоторыми колонками в числе которых number и issueDate.
Нужно сделать следующее: при сортировке по дате - сортируем по дате как обычно; при сортировке по номеру - нужно сортировать по году (взятому из даты) и далее (внутри года) по номеру.
@MetaProperty(related = {"issueDate", "number"})
public String getFormattedNumber() {
//
}
не подходит, т.к. нужно год вытаскивать, из даты.
попытался сделать с помощью
public class CustomJpqlSortExpressionProvider extends DefaultJpqlSortExpressionProvider {
@Override
public String getDatatypeSortExpression(MetaPropertyPath metaPropertyPath, boolean sortDirectionAsc) {
if (metaPropertyPath.getMetaClass().getJavaClass().equals(TheoryExamProtocol.class)) {
if ("number".equals(metaPropertyPath.toPathString())) {
return String.format("EXTRACT(YEAR FROM {E}.issueDate) %1$s, {E}.number %1$s NULLS FIRST", sortDirectionAsc ? "asc" : "desc");
}
if ("issueDate".equals(metaPropertyPath.toPathString())) {
return String.format("{E}.issueDate %1$s, {E}.number %1$s NULLS FIRST", sortDirectionAsc ? "asc" : "desc");
}
}
/* */
return String.format("{E}.%s", metaPropertyPath.toString());
}
}
Но тут выяснилось что в итоговый запрос из строки EXTRACT(YEAR FROM {E}.issueDate) desc, {E}.number desc NULLS FIRST
попадает только EXTRACT(YEAR FROM {E}.issueDate) desc
.
Дебаггером выяснилось, что до какого-то момента expression выглядит “нормально”.
Но после того, как он попадает в parseOrderByItem()
с ним что-то происходит (на какое-то дерево разбивается), в результате чего пропадает всё после первой запятой.
И итоговый запрос выглядит так
Вот и вопрос. Через CustomJpqlSortExpressionProvider
нет возможности задать сортировку по нескольким параметра? или это как-то по другому нужно записывать, синтаксис может особый какой-то? Или это, всё таки, баг?