Hibernate Criteria按特定状态排序

时间:2010-12-22 15:41:05

标签: hibernate criteria formula

您好 在数据库中,我们有一个PRSN_ADDRESS表,它有许多地址。用户在网格中显示这些地址。要求是先显示与该用户状态关联的地址,然后显示所有其他状态。

例如,假设该表有10条记录,其中5条地址的状态为马里兰州,2条来自PA,3条来自新泽西州。现在,如果用户与马里兰州相关联,我们需要显示所有10个地址,但马里兰州的地址应该显示在前五个地址中,然后是其他5个地址。

我们正在使用Hibernate Criteria。我还没有参加过Formulas,也不确定这是否有助于解决问题。如果有人能指出我正确的方向,那将是很棒的。我很欣赏。

由于

哈里什

3 个答案:

答案 0 :(得分:5)

您可以按条件值排序......

(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

答案 1 :(得分:4)

我确信这有一种切实可行的方法,但我最初的想法是做两个查询。首先是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

答案 2 :(得分:0)

哈里什,     如果我理解正确,您所要做的就是为标准添加顺序。 List addresses = sess.createCriteria(PRSN_ADDRESS.class) .addOrder( Order.asc(user.state) ) .list();