0

次のように、@OneToMany と @ManyToOne の双方向リレーションを持つ 2 つのテーブルがあります。

@Entity
public class Asset {
    private int id;
    private int count;
    @OneToMany
    private Set<Dealing> dealings;
...
}

@Entity
public class Dealing {

    private int id;
        ...
    @ManyToOne
    @JoinColumn(name = "customer_id", nullable = false, updatable = false)
    private Customer customer;
    @ManyToOne
    @JoinColumn(name = "product_id", nullable = false, updatable = false)
    private Product product;
    @ManyToOne(cascade = CascadeType.ALL)
    private Asset asset;
}

どうでもいい話なのですが、このように制限を使ってデータを検索したいときは、

session.createCriteria(Asset.class).add(Restrictions.eq("dealings.customer.id", customerId)).add(Restrictions.eq("dealing.product.id", productId)).list();

このレベルでは、このエラーが発生します。

could not resolve property: dealings.customer of: com.project.foo.model.Asset

解決策の 1 つは私の戦略を変更することですが、私はこれを見つけるために時間を無駄にしました。

4

1 に答える 1

1

まず、双方向の OneToMany アソシエーションはありませんが、2 つの無関係な単方向のアソシエーションがあります。mappedBy双方向の OneToMany アソシエーションでは、次の属性を使用して、One 側を Many 側の逆としてマークする必要があります。

@OneToMany(mappedBy = "asset")
private Set<Dealing> dealings;

第 2 に、このような静的クエリに基準 API を使用するのはやり過ぎであり、必要以上に読みにくいコードにつながります。基準は動的クエリ、IMHO に使用する必要がありますが、静的クエリには使用しないでください。

select asset from Asset asset 
inner join asset.dealings dealing
where dealing.customer.id = :customerId
and dealing.product.id = :productId

HQL と Criteria のどちらを使用しても、 はコレクションであるため使用できませasset.dealings.customerasset.dealings。コレクションには顧客属性がありません。Dealing エンティティからプロパティを参照できるようにするには、上記の HQL クエリに示すように、結合が必要です。基準についても同じです。

Criteria criteria = session.createCriteria(Asset.class, "asset");
criteria.createAlias("asset.dealings", "dealing"); // that's an inner join
criteria.add(Restrictions.eq("dealing.customer.id", customerId);
criteria.add(Restrictions.eq("dealing.product.id", productId);
于 2013-01-27T22:30:43.240 に答える