Hibernate - 按公式属性排序标准

And*_*uta 7 oracle hibernate hibernate-criteria

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

s.createCriteria(MyEntity.class) 
    .setProjection( 
        Projections.distinct( 
            Projections.property("fmlaProp"))) 
    .addOrder(Order.asc("fmlaProp"));
Run Code Online (Sandbox Code Playgroud)

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

SELECT DISTINCT fmlaProp-sql FROM MY_ENTITY_TABLE ORDER BY fmlaProp-sql
Run Code Online (Sandbox Code Playgroud)

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

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

哪个生成"按别名排序1",工作正常.但它有点难看 - 代码必须"知道"那些违反"一次写入"原则的公式属性.对此有何想法或建议?先感谢您.

Ada*_*kes 1

这是 Hibernate 的预期行为。它与公式属性无关,但您想要使用预计值进行排序。来自Hibernate 文档

可以将别名分配给投影,以便可以在限制或排序中引用投影值。这里有两种不同的方法来做到这一点......

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