Критерии гибернации упорядочены по конкретному состоянию - PullRequest
3 голосов
/ 22 декабря 2010

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

Например, скажем, в таблице 10 записей, причем 5 из адресов имеют штат Мэриленд, 2 из PA и 3 изНью-Джерси.Теперь, если пользователь связан с Мэрилендом, нам нужно показать все 10 адресов, но адреса Мэриленда должны отображаться в первых пяти, а затем в других 5 в любом порядке.

Мы используем критерии гибернации.Я не работал над формулами и не уверен, поможет ли это решить проблему.Было бы здорово, если бы кто-нибудь мог указать мне правильное направление.Я ценю это.

Спасибо

Хариш

Ответы [ 3 ]

5 голосов
/ 22 декабря 2010

Вы можете заказать по условному значению ...

(Кстати NHibernate, кто-нибудь знает эквивалент в Hibernate?)

.AddOrder(Order.Asc(
    Projections.Conditional(
         Restrictions.EqProperty("addr.state", "user.state"), Projections.Constant(0), Projections.Constant(1))))
.AddOrder(Order.Asc("addr.state"))

переводится в ...

order by 
    case when addr.state = user.state then 0 else 1 end,
    addr.state
4 голосов
/ 22 декабря 2010

Я уверен, что есть действительно умный способ сделать это, но моя первоначальная мысль - просто сделать два запроса. Первый с state == 'Maryland', а второй state != 'Maryland'. И сшить результаты вместе себя.

Возможно использование HQL:

from Person p order by case when p.addr.state = 'Maryland' then '0' else '1' end asc, p.addr.state asc

Я подготовил пример на github

https://github.com/gid79/q4510810-hibernate-criteria-order-by-a-specific-state

0 голосов
/ 22 декабря 2010

Harish, если я правильно понимаю, все, что тебе нужно будет сделать, это добавить порядок в критерии.List addresses = sess.createCriteria(PRSN_ADDRESS.class) .addOrder( Order.asc(user.state) ) .list();

...