Использование 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.
Я нашел этот пост:
но мне нужно ссылаться на присоединенные классы сущностей в каждом отдельном случае, и я не уверен, как это сделать.
Любая помощь или предложения высоко ценится.
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