说我有一个实体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带来了一个错误,说未选择按顺序表达。然后,我尝试了以下条件:
s.createCriteria(MyEntity.class)
.setProjection(
Projections.distinct(
Projections.alias(
Projections.property("fmlaProp"),
"alias1"))
.addOrder(Order.asc("alias1"));
生成“由alias1排序”的效果很好。但这有点丑陋-代码必须“知道”这些公式属性,这违反了“一次编写”的原则。有什么想法或建议吗?先感谢您。
最佳答案
这是Hibernate的预期行为。它不必专门与公式属性有关,而要对投影值进行排序。从Hibernate Docs:
至于替代方案,您可以尝试将Formula属性设置为虚拟列(在Oracle 11及更高版本中),或将表包装在计算了此列的 View 中。这样,Oracle将直接知道fmlaprop
,可以像“普通”列那样使用它。