0

単一テーブル戦略 (ディスクリミネーター付き) を使用して継承を使用します

UML スキーマ => http://yuml.me/67acf6a6

関連するすべての関連付け(車、本、テレビ)を使用して、顧客のすべての注文を取得したいと思います。モデルクラスを壊さずにこれを達成する方法を知っていますか?

@Entity
@Table(name = "customers")
public class Customer{
  private Date birthDate;
  private String name;

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "customer", cascade = CascadeType.ALL, orphanRemoval = true)
  @OrderBy("order")
  private List<? extends Order> orders;
}

@Entity
@Table(name = "orders")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public abstract class Order{

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @NotNull
    @JoinColumn(name = "CustomerID")
    private Customer customer;
}


@Entity
@DiscriminatorValue("book")
public class BookOrder extends Order {

  @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name="book_id")
  private Set<Book> books;
}

@Entity
@DiscriminatorValue("car")
public class CarOrder extends Order {

  @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name="car_id")
  private Set<Car> cars;
}

@Entity
@DiscriminatorValue("tv")
public class TvOrder extends Order {
  @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name="tv_id")
  private Set<Tv> tvs; 
}

私がHQLでやっているなら

select cutomer from customer customer
inner join fetch customer.orders order
left join fetch order.cars
left join fetch order.books
left join fetch order.tvs

エラーが発生します

org.hibernate.QueryException: could not resolve property: cars, 

抽象クラス Order this フィールドが存在しないことは理にかなっています。

どうすればこれを達成できるか知っていますか? この場合の休止状態の推奨事項は何ですか?

私の目標は、単純なクエリを単純化し、すべてを取得することです。

4

1 に答える 1

0

次のクエリを実行すると

select c from customer c
join fetch c.orders

次に、任意のタイプの注文 (車 | 本 | テレビ) を持つすべての顧客を取得します。これらの注文は多態的ですinstanceof。Customer.orders 要素ごとに行うと、注文要素のタイプを判別できます。

于 2013-07-18T15:11:48.517 に答える