【问题标题】:Hibernate Criteria order by a specific state特定状态的休眠标准顺序
【发布时间】:2010-12-22 15:41:05
【问题描述】:

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

例如,假设该表有 10 条记录,其中 5 个地址的州为马里兰州,2 条来自宾夕法尼亚州,3 条来自新泽西州。现在,如果用户与马里兰州相关联,我们需要显示所有 10 个地址,但马里兰州地址应显示在前 5 个中,然后按任意顺序显示其他 5 个。

我们正在使用休眠标准。我没有研究过公式,不确定这是否有助于解决问题。如果有人能指出我正确的方向,那就太好了。我很感激。

谢谢

哈里什

【问题讨论】:

    标签: hibernate criteria formula


    【解决方案1】:

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

    (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
    

    【讨论】:

    • Joe,感谢您的回复,但我在 Projections.Constant 上遇到编译器错误。对吗?
    • 另外我使用的是 Java & Hibernate 而不是 nHibernate。所以 Projections.Conditional & Projections.Constant 在 Eclipse 上给出编译器错误。 Hibernare 上是否有等价物
    • 是的,这是给 NHiberante 的...我不知道它在 Hibernate 中叫什么。
    • 我在 hibernate api 上的 google 技能是空白的......肯定有类似的东西吗?
    • 谢谢乔。您的 SQL 工作得很好,但我无法获得 Hibernate 等价物:(。有人可以帮忙吗:)
    【解决方案2】:

    我确信有一种非常巧妙的方法可以做到这一点,但我最初的想法只是做两个查询。首先是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

    【讨论】:

    • 非常感谢加雷斯。我仍在尝试使用 Criteria API 获得解决方案。如果这不起作用,我会更改为 HQL,因为我过去没有使用过 HQL,并且它涉及对现有代码的大量更改。欣赏它。
    • 在这种情况下,最简单的解决方案就是进行两次查询,该功能将在一个小时内完成。
    【解决方案3】:

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

    【讨论】:

    • 这不会把用户的状态作为最重要的结果。它只会按字母顺序排列用户的状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2012-12-24
    相关资源
    最近更新 更多