【问题标题】:Is there a way to rank results using Hibernate's Criteria API?有没有办法使用 Hibernate 的 Criteria API 对结果进行排名?
【发布时间】:2013-11-16 19:02:17
【问题描述】:

我有一个查询将变得非常复杂,我们希望将其切换到 Criteria API 以使其易于管理。我们基本上选择一些匹配过滤器的数据,但根据匹配的过滤器数量对结果集进行排序。为此,我们在 select 子句中添加一个字段来跟踪匹配的过滤器数量。

举个例子会很有帮助:

http://sqlfiddle.com/#!4/90e02/2

有没有办法使用 Hibernate Criteria API 来做到这一点。我们的目标是确保这不会成为创建我们必须维护的大型 HQL 字符串的代码。

我不一定需要一个例子作为答案(虽然那会很棒!)但是一个是/否和一些可以告诉我如何完成的东西会起作用。

【问题讨论】:

    标签: oracle hibernate jpa hql criteria


    【解决方案1】:

    是的,它可以做到。 Here 是构建 SQL CASE 表达式的 API。

    这里有一些伪代码:

    CriteriaBuilder cb = ...
    javax.persistence.criteria.Expression rankExpression = 
            cb.sum(
                  cb.selectCase().when(first_name = 'Carter',1).otherwise(0),
                  cb.sum(cb.selectCase().when(last_name = 'Mason',1).otherwise(0),
                         cb.sum(...)
                         )
                  );
    

    【讨论】:

    • 我投了你一票,但不推荐使用 Expression。我想我找到了另一种(更复杂的)方法来做到这一点。
    • hum... javax.persistence.criteria.Expression 是 JPA 2.0 的一部分,似乎并没有被弃用。
    【解决方案2】:
    【解决方案3】:

    您可以使用@Formula 注释并将(CASE WHEN ... END) 表达式放在rank 字段中。

    【讨论】:

    • 这可能行不通,因为我们需要能够动态指定条件。 @Formula 注释仅在编译时已知条件时才有效。
    • @Chris Williams 在这种情况下您可以使用存储过程和@Formula 在这种情况下。
    • 感谢您的帮助。存储过程不是我们的选择,即使它们是,我们也必须能够将值传递给存储过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2010-11-06
    • 2016-04-02
    相关资源
    最近更新 更多