【问题标题】:JPA2 + Hibernate + Order ByJPA2 + 休眠 + 排序方式
【发布时间】:2010-06-07 12:50:00
【问题描述】:

是否可以 (using Hibernate and JPA2 Criteria Builder) 按方法结果而不是实体成员进行排序?

public class X {
    protected X() {}
    public String member;
    public String getEvaluatedValue() { // order by
        return "a status calculated with various members";
    }
}

我想要实现的是按getEvaluatedValue() 的结果排序。这可能吗?

我没有使用@Formular,但是

EntityManager em = ...;
QueryBuilder builder = em.getQueryBuilder();
SomeQueryClass query = builder.createQuery(MyTargetClass.class);
query.orderBy(builder.asc(... some code...));

虽然它是普通的 JPA2,但您当然是对的,但没有机会通过动态数据进行排序。但是我可能被允许使用 if-else 或任何语句(使用我的 QueryBuilder 定义)指定一些 order-by 块,不是吗?

【问题讨论】:

    标签: hibernate jpa-2.0 hibernate-entitymanager


    【解决方案1】:

    我不知道这是否可能(如果属性是瞬态的,即在数据库中没有表示,那么 SQL 结果应该是什么?)但更重要的是,按@987654321 排序有什么区别@ 和 member?也许这只是一个例子......

    【讨论】:

    • 当然只是一个例子。问题是我必须计算一个事件状态,这取决于各种成员。因为它是经过计算的,所以将其存储在数据库中只是为了排序是没有意义的。
    • @Jan 是的,我同意。但我认为数据库无论如何都不会很好地对结果进行排序(因为缺少索引)。由于我的理解是您使用的是 @Formula 而不是普通的标准 JPA2.0(因此可能有一种 Hibernate 方式),因此我将对此进行深入研究。
    【解决方案2】:

    看起来不可能,原因如下: 在 SQL 层中运行查询时,不计算“EvaluatedValue”字段。它只是稍后填充(确切的时间,我不知道,它可能取决于实体是否使用 LAZY 模式)。 JPA Query 对象与 SQL 密切相关,即数据库中的内容。

    可能,我会使用 getResultList() 获得未排序的结果,然后手动对它们进行排序:

    使您的 EvaluatedValue 成为实现 Comparable 的类型: see here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-13
      • 2015-07-25
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多