Использование mysql "порядок в каждом случае" в критериях гибернации

Я использую Hibernate 4.3.1 final, Mysql 5.5, и я хочу использовать логику упорядочения в каждом порядке.

Чистое представление sql того, чего я хочу достичь, будет выглядеть примерно так:

select adv.id, adv.published_date 
from advert as adv 
  join account as act on act.id = adv.act_id
  join account_status as aas on aas.id = act.current_aas_id
order by case aas.status
when 'pending' THEN 1
when 'approved' THEN 1
else 2
end, adv.published_date;

Это упорядочивает рекламу ожидающих и одобренных аккаунтов перед объявлениями неактивных аккаунтов.

Мне удалось выполнить все запросы на выборку с использованием критериев гибернации, но я не уверен, как указать порядок в каждом случае, используя этот API.

Я нашел этот пост:

http://blog.tremend.ro/2008/06/10/how-to-order-by-a-custom-sql-formulaexpression-when-using-hibernate-criteria-api/

но мне нужно ссылаться на присоединенные классы сущностей в каждом отдельном случае, и я не уверен, как это сделать.

Любая помощь или предложения высоко ценится.

2 ответа

Я думаю, что нашел решение.

В конце я создал свой собственный подкласс Order и переопределил открытый метод String toSqlString(Criteria,CriteriaQuery):

@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
    final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, getPropertyName() );
    final StringBuilder fragment = new StringBuilder();
    fragment.append(" case ").append(columns[0]);
    fragment.append(" when 'pending' then 1 ");
    fragment.append(" when 'approved' then 1 ");
    fragment.append(" else 2 end");
    return fragment.toString();
}

важный вызов (который я нашел в оригинальной реализации класса заказа)

criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());

Это дало мне доступ к псевдониму для столбца, который я хотел заказать при использовании оператора case.

Если кто-то еще смотрит на это, если вы упорядочиваете свойство, не принадлежащее корневому объекту, убедитесь, что вы используете псевдонимы в своих критериях объединений, и что вы затем правильно ссылаетесь на эти псевдонимы в свойстве пользовательского свойства propertyName, когда вы инстанцировать это.

В дополнение к /questions/33684957/ispolzovanie-mysql-poryadok-v-kazhdom-sluchae-v-kriteriyah-gibernatsii/33684974#33684974 Вероятно, стоит упомянуть, что теперь вы добавляете подкласс Order следующим образом

criteria.addOrder(new CustomOrder());

и не

criteria.addOrder(CustomOrder.desc(fieldName));

потому что desc / asc - это статические методы, которые по-прежнему создают экземпляр Order вместо вашего CustomOrder

Другие вопросы по тегам