2011-11-24 9 views
7

エンティティMyEntityがあり、式ベースのプロパティfmlaPropがあります。今、私は基準を作成言う:Hibernate - 数式プロパティによる注文条件

この場合
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

エイリアスを投影に割り当て、投影値を制限または順序で参照できるようにすることができます。これを行うには2通りの方法があります...

これまでの数式プロパティを仮想列(Oracle 11以上のバージョン)にするか、またはこれを使って表をラッピングすることができます計算された列。そうすれば、Oracleはfmlapropを直接知ることができます。これは "通常の"列のように使用できます。