OpenJPA 1.2.1: детальный план выборки - PullRequest
0 голосов
/ 05 декабря 2011

Предположим, у меня есть следующее:

@Entity
class Product {
  @OneToOne(Lazy)
  ProductType type;
}

@Entity
class ProductType {
  @ManyToOne(Lazy)
  ProductFamily pf;
}

@Entity
class ProductFamily {
  String name;
  // ...
}

По умолчанию OpenJPA имеет глубину выборки -1 , и кажется, что если я запрашиваю Product:

select p from Product p

в конечном итоге он запросит что-то вроде этого:

select p from product p
left join product_type
left join product_family

Я прочитал о глубине выборки и могу ограничить глубину выборки до 1 , что означает, что запрос будет извлекать только непосредственные отношения:

select p from product p
left join product_type

но как я могу настроить запрос, чтобы можно было указать выборочное соединение для вложенных отношений ? Я пробовал и left fetch join, и добавление полей в план выборки, но это не работает.


, чтобы прояснить: я хочу, чтобы all *-to-One relations по умолчанию был ленивым, а затем настраивал отношения с помощью fetch joins, но кажется, что OpenJPA игнорирует ленивую конфигурацию.

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Плохо, мне пришлось включить трансформацию классов, чтобы включить отложенную загрузку.Опираясь на усовершенствование байт-кода, OpenJPA выдает предупреждение, в котором говорится только об этом.

1 голос
/ 05 декабря 2011

Не уверен, что понимаю. Если вы хотите иметь возможность указать, что должно быть извлечено, вам нужно пометить свои ассоциации как ленивые и загрузить свои объекты с помощью запросов. По умолчанию ассоциации * ToOne стремятся, а ассоциации * ToMany ленивы. После пометки как ленивые возможны следующие запросы:

select p from Product p // load only the products

select p from Product p 
left join fetch p.type // load products with their type

select p from Product p 
left join fetch p.type t 
left join fetch t.pf // load products with their type and the family of their type

Если ассоциация стремится к тому, чтобы код, используемый для загрузки объекта, будет извлечен для его ассоциации.

...