Hibernate - 按公式属性排序标准

时间:2011-11-24 13:44:40

标签: oracle hibernate hibernate-criteria

假设我有一个实体MyEntity,它有一个基于公式的属性fmlaProp。现在说我创建了一个标准:

s.createCriteria(MyEntity.class) 
    .setProjection( 
        Projections.distinct( 
            Projections.property("fmlaProp"))) 
    .addOrder(Order.asc("fmlaProp"));

在这种情况下,我得到以下SQL:

SELECT DISTINCT fmlaProp-sql FROM MY_ENTITY_TABLE ORDER BY fmlaProp-sql

这给了Oracle一个错误,说明了order-by表达式是未选中的。然后我尝试了以下标准:

s.createCriteria(MyEntity.class) 
    .setProjection( 
        Projections.distinct(
            Projections.alias(
                Projections.property("fmlaProp"),
                "alias1")) 
    .addOrder(Order.asc("alias1"));

哪个生成“按alias1排序”哪个正常。但它有点难看 - 代码必须“知道”那些违反“一次写入”原则的公式属性。对此有何想法或建议?提前谢谢。

1 个答案:

答案 0 :(得分:1)

这是Hibernate的预期行为。它与具体的公式属性没有关系,但您希望使用预计值进行排序。来自Hibernate Docs

  

可以为投影指定别名,以便可以在限制或排序中引用投影值。以下是两种不同的方法......

就替代方案而言,您可以尝试将公式属性设置为虚拟列(在Oracle 11及更高版本中),或者在计算此列的视图中包装表。这样,Oracle就会直接知道fmlaprop,这可以像“普通”列一样使用。