【问题标题】:Hibernate - Orderding criteria by formula propertyHibernate - 按公式属性排序标准
【发布时间】:2012-01-05 16:21:28
【问题描述】:

假设我有一个实体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"));

这会生成“按别名 1 排序”,效果很好。但这有点难看——代码必须“知道”那些公式属性,这违反了“一次编写”原则。对此有什么想法或建议吗?提前谢谢你。

【问题讨论】:

  • -sql 部分是什么?

标签: oracle hibernate hibernate-criteria


【解决方案1】:

这是 Hibernate 的预期行为。它与公式属性没有特别的关系,但您想使用预测值进行排序。来自Hibernate Docs

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2013-01-06
    • 2012-12-18
    相关资源
    最近更新 更多