2011-07-25 13 views
5

フィルタ条件に "AnotherEntity"のsuselectを使用して、 "MyEntity"オブジェクトをフィルタリングするために、Hibernateのフィルタを使用したいと思います。マッピングが見つからなかったかのように生成されたSQL文が代わりにマッピングされたテーブル「ANOTHER_TABLE」の「AnotherEntity」が含まれているため、Hibernateフィルタ条件でsubselect HQLを使用するにはどうすればよいですか?

<hibernate-mapping> 

    <filter-def name="myFilter" condition="someProperty in (select x.property1 from AnotherEntity x where property2 = :property2)"> 
    <filter-param name="property2" type="long"/> 
    </filter-def> 

    <class name="com.example.MyEntity" table="SOME_TABLE"> 
    <id name="OID" column="O_ID" type="long"> 
     <generator class="hilo"> 
     <param name="table">oid_id</param> 
     <param name="column">next_id</param> 
     </generator> 
    </id> 
    <version name="hibernateVersion" column="hibernate_version" unsaved-value="negative"/> 
    <property name="someProperty"/> 
    <filter name="myFilter"/> 
    </class> 

    <class name="com.example.AnotherEntity" table="ANOTHER_TABLE"> 
    <composite-id> 
     <key-many-to-one name="property1" ... /> 
     <key-many-to-one name="property2" ... /> 
    </composite-id> 
    </class> 

</hibernate-mapping> 

くれorg.hibernate.exception.SQLGrammarException: could not execute queryそれぞれのSQLException Table "ANOTHERENTITY" not foundを与える:構成は次のようになります。しかし、サブセレクトだけを実行すると、

select x.property1 from AnotherEntity x where property2 = :property2 

のようになります。

私はここで何が欠けていますか?私の設定は間違っていますか?フィルタにSuselect HQLを使用できますか?

+0

私は全く同じ問題があります。あなたは解決策を見つけましたか? – Saffar

+0

回答を作成しました。下記を参照してください。私は、HQLはサポートされていないので、SQLを書く必要があると思います。 –

答えて

4

フィルタ条件は、すべての点でHQLをサポートしていません。 SQLを使用するか、より正確にはWHERE句の断片を記述する必要があります。つまり、エンティティ名とプロパティ名ではなく、テーブル名とカラム名を使用する必要があります。

ただし、名前が付けられたプレースホルダを使用しても問題ありません。あなたはこのようなあなたの条件を記述し、問題の例にこだわり:HQLをSQLに変換しまった後ではなく、プレースホルダの交換が行われる前にこの条件をクエリに添付されたよう

<filter-def name="myFilter" condition="SOME_COLUMN in (select x.COLUMN_X from ANOTHER_TABLE x where COLUMN_Y = :foo)"> 
    <filter-param name="foo" type="long"/> 
    </filter-def> 

に思えます。少なくともHibernateのバージョン3.xでは。

+0

は、ハイバネートフィルタを使用して結合テーブルの列値に基づいて結合を行い、レコードをフィルタリングすることは可能ですか? –

+0

私は申し訳ありませんが、私はそれを設定していないし、それを試すことはできません。しかし、私はフィルタが結果のSQLのwhere句に追加されただけで動作すると思います。 –

+1

はhibernate filtesのように見えますが、結合テーブルのカラム値に基づいてフィルタリングさせません。https://hibernate.atlassian.net/browse/HHH-298を参照してください。 –

関連する問題