2012-06-09 13 views
6

Jak wymusić leniwe ładowanie strategii tylko dla danego NamedQuery.JPA - Force Lazy ładowanie tylko dla danego zapytania

dla np. Rozważmy poniższy kod pseudo (tylko w celu wyjaśnienia sprawy) Mam podmiot

@Entity 
class Xyz { 
int a; 
int b; 

@Fetch = EAGER 
Set<ABC> listOfItems; 
} 

w tym przypadku mamy zadeklarowane LISTOFITEMS się ochoczo idące.

Teraz załóżmy, że mam NamedQuery (query="getXyz" , name="select x from Xyz x where a=?") Dla tego zapytania, po prostu potrzebuję, aby wynik był leniwy, tzn. Nie chcę, aby lista została pobrana.

W jaki sposób mogę je osiągnąć? ps: 1. Nie chcę zmieniać LISTOFITEMS być leniwy w klasie Entity 2. Nie chcę, aby wybrać konkretne pola w zapytaniu jak name="select a,b from Xyz z where a = ? "

Z góry dzięki za sugestie

+0

Co zamierzasz zrobić z wynikiem NamedQuery? Mogą istnieć alternatywy dla tego, co próbujesz osiągnąć. – siebz0r

+0

@ siebz0r Chcę tylko pola pierwszego poziomu do wyświetlenia. Podczas gdy istnieją inne wyświetlacze, gdzie trzeba pobrać zestaw .. W moim przypadku chcę poprawić wydajność, nie chęcią je ściągając. Jeśli masz jakieś sugestie, udostępnij. Dzięki ! –

+0

Sugerowałbym przypisywanie zestawu jako leniwy. Dlaczego nie jest to możliwe? – siebz0r

Odpowiedz

1

Jeśli nie chcesz pobierać Set z zapałem, musisz zdefiniować to jako leniwy. Należy jednak pamiętać, że implementacja jest dozwolona do pobrania z niecierpliwością, gdy określisz leniwy.

Cytując specyfikację:

public enum FetchType rozciąga java.lang.Enum

Określa strategie pobierania danych z bazy danych. Strategia EAGER jest wymagana w środowisku wykonawczym dostawcy trwałości, że dane muszą być pobierane z niecierpliwością. Strategia LAZY jest wskazówką dla środowiska wykonawczego dostawcy utrwalania, że ​​dane powinny być pobierane leniwie podczas pierwszego dostępu. Implementacja jest dozwolona, ​​aby pobierać dane, dla których została określona wskazówka LAZY.

Jeśli jednak nie chcesz sprowadzić taki Set bym jako alternatywa utworzyć małą klasę do swoich potrzeb:

@Entity 
@Table(name = "XYZ") 
public class XyzStub 
{ 
    int a; 
    int b; 
} 

Można zapytać o to przy użyciu TypedQuery:

EntityManager em; 
//.... 
TypedQuery<XyzStub> q = em.createNamedQuery("select x from XyzStub x where x.a = :a", XyzStub.class) 
q.setParameter("a", a); 
Powiązane problemy