2011-11-24 25 views
7

假設我有一個實體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 

這給甲骨文說,訂單被表達是錯誤的非選擇。然後我嘗試了以下標準:

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

它生成「order by alias1」,它工作正常。但它有點醜 - 代碼必須「知道」那些公式屬性,這違反了「一次寫入」的原則。對此有何想法或建議?先謝謝你。

+1

什麼是'-sql'部分? – cherouvim

回答

1

這是Hibernate的預期行爲。它不需要特別針對公式屬性,而是希望以預計值進行排序。從Hibernate Docs

別名可以被分配到一個投影,使得投影值可以在限制或排序所引用。這裏有兩種不同的方法來做到這一點...

至於替代方法,你可以嘗試使公式屬性成爲一個虛擬列(在Oracle 11和更高版本中),或者用這個包裝表列計算。這樣,Oracle將直接知道fmlaprop,這可以像「普通」列一樣使用。