2

私はテーブルA、B、Cを持っています.Bは列を追加した関連テーブルです

| | あ | 1 .. * | ビ | * .. 1 | シー |

エンティティ A とエンティティ B のリスト

@Entity
@Table(name = "a")
public class A {
    //id

    @OneToMany(mappedBy="bPK.a", cascade={CascadeType.ALL})
    private List<B> listB; 

    // getters, setters
} 

エンティティ B には PK が埋め込まれています

@Entity
@Table(name = "b")
public class B {
    @EmbeddedId
    private BPK bPK; 

    // added columns
    // getters, setters
}

埋め込み主キー クラス:

@Embeddable
public class BPK implements Serializable {
    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="i_a", nullable=false)
    private A a;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="i_c", nullable=false)
    private C c;

    // getters, setters
}

実体C

@Entity
@Table(name = "c")
public class C {
    @Column(name = "i_c")
    private Long iC;

    @Column(name="name")
    private String name; 

    // getters, setters
}

...そして、オブジェクト C を具体的な名前に関連付けたオブジェクト A を取得したいと思います

私はこの方法でそれをやろうとしましたが、うまくいきません

Criteria criteria = session.createCriteria(A.class);  
criteria.createAlias("listB", "bList")
criteria.add(Restrictions.like("bList.bPK.c.name", "name", MatchMode.ANYWHERE));

次の例外があります。

org.springframework.orm.hibernate3.HibernateQueryException: プロパティを解決できませんでした: bPK.c.name

ご協力ありがとう御座います

4

3 に答える 3

1

この問題はバグとして報告されたようです。

https://hibernate.atlassian.net/browse/HHH-6963

于 2012-05-11T11:26:26.627 に答える
0

それが得られる理由は、Hibernate が で列を探しているためbPk.c.namebList (A class)あり、明らかにそのような列はありません。あなたが達成しようとしていることは、私の複数のエイリアスで行うことができます(エイリアスを作成するとき、基準は現在のテーブルとそのテーブルの結合も行っています)。

したがって:

Criteria criteria = session.createCriteria(A.class);  
criteria.createAlias("listB", "bList")
    .createAlias("bList.bPk", "bPk")
    .createAlias("bPk.c", "c")
    .add(Restrictions.like("c.name", "name", MatchMode.ANYWHERE));

MatchMode.ANYWHERE は必要ないと思います。

于 2012-05-07T13:08:03.897 に答える