假设我有一个实体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排序”哪个正常。但它有点难看 - 代码必须“知道”那些违反“一次写入”原则的公式属性。对此有何想法或建议?提前谢谢。
答案 0 :(得分:1)
这是Hibernate的预期行为。它与具体的公式属性没有关系,但您希望使用预计值进行排序。来自Hibernate Docs:
可以为投影指定别名,以便可以在限制或排序中引用投影值。以下是两种不同的方法......
就替代方案而言,您可以尝试将公式属性设置为虚拟列(在Oracle 11及更高版本中),或者在计算此列的视图中包装表。这样,Oracle就会直接知道fmlaprop
,这可以像“普通”列一样使用。