JPA OneToMany отношения и производительность - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть две сущности: родительская Customer и дочерняя Order.
Каждый Customer имеет, например, 1 000 000 Orders, поэтому в каждый конкретный момент времени нет необходимости загружать Customer со всеми Orders, но я хочу иметь эту возможность для выполнения запроса на соединение этих двух объектов в JPA.
Поэтому из-за этого я должен создать @OneToMany отношение для выполнения запросов соединения.

У меня вопрос: как получить запрос без выполнения joinColumn, потому что даже в режиме Lazy можно загрузить 1 000 000 объектов!
Я просто хочу получить запрос к этим объектам с такими ограничениями, как нативное соединение.

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Если вы не хотите, чтобы отношение @OneToMany неявно устанавливалось в вашем классе Customer, то вам это не нужно.Вы можете выполнять JPQL-запросы (очень точно) без отмеченной связи.

Предположим, у вас есть:

@Entity
public class Customer {

    // all Customer-related fields WITHOUT @OneToMany relationship with Order
}

@Entity
public class Order {

    @ManyToOne
    private Customer owner;
}

Тогда, если вы хотите получить все Orders для конкретного CustomerВы можете выполнить простой JPQL-запрос, подобный следующему:

// Customer customer = ...
// EntityManager em = ...

String jpql = "SELECT o FROM Order o WHERE o.owner = :customer";

TypedQuery<Order> query = em.createQuery(jpql, Order.class);
query.setParameter("customer", customer);

List<Order> orders = query.getResultList();

Таким образом, вы можете выполнить код только тогда, когда действительно уверены, что хотите получить Customer's ордеров.

Iнадеюсь, я правильно понял вашу проблему.

2 голосов
/ 29 ноября 2011

EclipseLink поддерживает QueryKeys, которые позволяют вам определять поля или отношения для запросов, которые не отображаются.В настоящее время нет поддержки аннотаций для ключей запроса, но вы можете определить их с помощью API и DescriptorCustomizer.

Также вам не нужно OneToMany для запроса к нему, просто используйте обратный ManyToOne для запроса,

то есть

Select distinct c from Customer c, Order o where o.customer = c and o.item = :item

или

Select distinct o.customer from Order o join o.customer c where o.customer = c and o.item = :item
...