2013-07-18 3 views
0

Я использую единую стратегию таблицы (с дискриминатором) использовать наследованиеJPA/Hibernate ребенок запрос свойство

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, 

Это имеет смысл в абстрактном классе ордена это поле оленья кожа существует.

Вы знаете, как я могу это достичь? какова рекомендация спящего режима в этом случае?

Моя цель - простой простой запрос и получение всего.

+0

В запросе используется запятая вместо точки и не присваивается псевдоним для заказа. Это реальный HQL? Тем не менее, вы не можете получить несколько пакетов, поэтому, даже если такой запрос возможен, он, вероятно, не будет работать, если ваши коллекции не являются наборами. –

+0

Жаль, что исправил. Я меняю с помощью наборов, но я как достигаю этого –

+0

У вас все еще нет псевдонима. Это должно быть 'internal join fetch customer.orders заказы ...' –

ответ

0

Если вы следующий запрос

select c from customer c 
join fetch c.orders 

тогда Вы получите все клиенты с любыми типами заказов (автомобили | книги | TVS). Эти заказы являются полиморфными, если do instanceof для каждого элемента Customer.orders, вы можете определить, какой тип элемента заказа.

+0

Nop, если я так делаю, я буду использовать ленивую загрузку. Это не оптимально. Я хочу получить связанные ассоциации (автомобили, книги, телевизоры), объявляющие в LAZY в один или два раза. –

+0

Вы уверены, что это досталось лениво? Здесь мы используем выбор подключения, он предварительно выбирает коллекцию, которая в нашем случае является полиморфной. – Sqeezer

+0

Я говорю о дочерних ассоциациях (BookOrder.books, CarOrder.cars, TvOrder.tv), коллекция объявлена ​​LAZY, она не будет выбрана. Я пытаюсь найти способ получить все, у меня есть некоторые решения, но это ломает модели. Единственное решение, которое я получил, - это сделать отдельный запрос для получения каждой дочерней ассоциации. Но он не оптимизирован. –

Смежные вопросы