Есть некоторая сущность со строковым атрибутом number, который представляет из себя некоторым образом конкатинированную дату и номер.
public class CheckRequest {
@NotNull
@Column(name = "NUMBER_", nullable = false)
private String number; // значению вида mm_yy_xxx, например, 02_12_001.
}
При выводе в таблицу необходимо сортировать по этому атрибуту некоторым образом разобрав строку.
Пытаюсь сделать это расширив DefaultJpqlSortExpressionProvider
(тут в качетстве сортируемой сущности выступает CheckRequestStuff
у которой есть ассоциация на CheckRequest
):
public class CustomSortExpressionProvider extends DefaultJpqlSortExpressionProvider {
@Nonnull
@Override
public String getDatatypeSortExpression(MetaPropertyPath metaPropertyPath, boolean sortDirectionAsc) {
final Class<Object> javaClass = metaPropertyPath.getMetaClass().getJavaClass();
final String propertyPath = metaPropertyPath.toPathString();
final String sortDirection = sortDirectionAsc ? "ASC" : "DESC";
if (javaClass.equals(CheckRequestStuff.class) && "request.number".equals(propertyPath)) {
return String.format(
"CAST(SUBSTRING({E}.%1$s, 4, 2) BIGINT) %2$s, CAST(SUBSTRING({E}.%1$s, 1, 2) BIGINT) %2$s, CAST(SUBSTRING({E}.%1$s, 7) BIGINT) %2$s",
metaPropertyPath,
sortDirection
);
}
return String.format("{E}.%s", metaPropertyPath);
}
}
Но это не работает.
Если дебагером посмотреть во что в итоге “превращается” JPQL, то видно, что в QueryTransformerAstBased
после parseOrderByItem(expression)
от изначального выражения остаётся только первая часть, до запятой CAST(SUBSTRING(e.number, 4, 2) BIGINT)
.
В итоге сортировка отрабатывает, но только по одному оставшемуся выражению.
Вопрос. Через JpqlSortExpressionProvider
нет возможности задать сортировку по нескольким параметрам? или это как-то по другому нужно записывать, синтаксис может особый какой-то? Или это, всё таки, баг?
JMIX 1.5.5
Подобная проблема тянется из CUBA, потому что используется один и тот же парсер. Я там тоже задал подобный вопрос (Сортировка по нескольким property через JpqlSortExpressionProvider - Вопросы и проблемы - CUBA.Platform), но немного с другими входными данными. Ответа так и не дождался, никакого. А хотелось бы.