Hibernate - критерии упорядочения по свойству формулы - PullRequest
7 голосов
/ 24 ноября 2011

Скажем, у меня есть сущность MyEntity, и у нее есть свойство на основе формулы fmlaProp. Теперь скажите, что я создаю критерии:

s.createCriteria(MyEntity.class) 
    .setProjection( 
        Projections.distinct( 
            Projections.property("fmlaProp"))) 
    .addOrder(Order.asc("fmlaProp"));

в этом случае я получаю следующий SQL:

SELECT DISTINCT fmlaProp-sql FROM MY_ENTITY_TABLE ORDER BY fmlaProp-sql

Что дает ошибку в Oracle, говоря, что выражение order-by не выбрано. Тогда я попробовал следующие критерии:

s.createCriteria(MyEntity.class) 
    .setProjection( 
        Projections.distinct(
            Projections.alias(
                Projections.property("fmlaProp"),
                "alias1")) 
    .addOrder(Order.asc("alias1"));

Который генерирует "order by alias1", который отлично работает. Но это отчасти уродливо - код должен «знать» те свойства формулы, что нарушает принцип «написать один раз». Есть мысли или предложения по этому поводу? Заранее спасибо.

1 Ответ

1 голос
/ 30 января 2012

Это ожидаемое поведение от Hibernate.Это не относится конкретно к свойству формулы, а к тому, что вы хотите делать упорядочение с прогнозируемым значением.Из документов гибернации :

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

Что касается альтернатив, вы можете попробовать сделать свойство формулы виртуальным столбцом (в версиях Oracle 11 и выше) или обернуть таблицу впросмотр с этим столбцом вычисляется.Таким образом, Oracle будет знать fmlaprop напрямую, что можно использовать как «обычный» столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...