1

私は 3 つのクラスを持っておりBase、次のようChildOther定義されています。

@Entity
@Filter(name = "myFilter", condition = "propBase = 'special'")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Base {
   private String propBase;

   //Getters, Setters
}

@Entity
public class Child extends Base {
   private String propChild;

   //Getters, Setters
}

@Entity
public class Other {
   @Filter(name = "myFilter", condition = "propBase = 'special'")
   private Set<Child> myList;

   //Getters, Setters
}

フィルターがパッケージ レベルで定義されていると仮定すると、それを使用するすべてのクラスから表示されます。

myFilterを有効にしたセッションを使用して、データベースから のインスタンスを取得Otherします。次に、コレクションにアクセスしようとするとmyList、コレクションが遅延として宣言されているため、Hibernate はデータベースからコレクションをフェッチしようとします。しかし、生成された SQL クエリには予想外のことがありました。テーブルのエイリアスが列Childの前に使用されていpropBaseます。この列はテーブルで定義されていないためChild(で定義されていますBase)、次のエラーが発生します。 :

エラー JDBCExceptionReporter - 「where 句」の列「childAlias.propBase」が不明です

このスレッドによると、それは予想される動作のようですが、どのようになるのかわかりません。また、これが予想される動作であると仮定すると、条件が基本クラスで定義されたプロパティを使用するときにフィルタリングを使用する方法は?

ありがとう

4

2 に答える 2

-1

私は Hibernate 4.1 を使用していますが、同じ問題がありました。これは、条件が実際に定義されているエンティティ クラスを Hibernate に伝える方法を説明しています。@Filter アノテーションにエイリアスを追加すると、問題が解決しました。

JPQL select ステートメントでは、継承による属性名の解決が直接機能しました。

于 2013-02-21T09:10:55.300 に答える