При выполнении операции выбора с заказом в поле гибернации, которое сохраняется в БД с двумя столбцами, порядок прерывается, потому что asc и desc не работают должным образом.
Пример определения поля:
@Columns(columns = {@Column(name = "currency"), @Column(name = "value")})
private BigMoney price;
При выполнении выбора с заказом по этому полю критерий api создает hql следующим образом:
select * from SOMETABLE order by price desc
В какой-то момент hibernate переводит hql в sql, который выглядит так:
select * from SOMETABLE order by currency, value desc
Это неправильно. Должно быть
select * from SOMETABLE order by currency desc, value desc
Как это можно обойти? Кажется, проблема в org.hibernate.dialect.Dialect :: renderOrderByElement:
public String renderOrderByElement(String expression, String collation, String order, NullPrecedence nulls) {
final StringBuilder orderByElement = new StringBuilder( expression );
if ( collation != null ) {
orderByElement.append( " " ).append( collation );
}
if ( order != null ) {
orderByElement.append( " " ).append( order );
}
if ( nulls != NullPrecedence.NONE ) {
orderByElement.append( " nulls " ).append( nulls.name().toLowerCase( Locale.ROOT ) );
}
return orderByElement.toString();
}
Там ожидался один порядок по выражению. Но в моем случае он передает два составных выражения.