2014-05-13 11 views
7

Mam sytuację, w której encja Card ma klucz obcy dla osoby.Tryb pobierania Querydsl w zapytaniu

public class Card implements java.io.Serializable { 
private String cardid;  
private Person person; 

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="USERID") 
public Person getPerson() { 
    return this.person; 
} 
} 

Domyślnym typem pobierania dla osoby jest LAZY. Czy mogę określić typ pobrania dla EAGER w zapytaniu:

QCard qCard = QCard.card; 
JPQLQuery query = getQuery().from(qCard); 
query.list(qCard); 

Dzięki za pomoc.

+0

Możesz po prostu zadzwonić do 'getPerson()' metody, aby załadować obiekt Person zanim obiekt zostanie odłączony, masz konkretny powód, aby zmienić typ pobierał? –

+0

Powodem, dla którego chcę zmienić typ pobierania, jest optymalizacja zapytania. Mam przypadek, w którym muszę załadować wiele obiektów kluczy obcych. Wydaje się działać wolno. – Marko

+0

Poszukujesz słowa kluczowego "FETCH" z JPAQL w QueryDSL. Czy tego właśnie szukasz? https://groups.google.com/forum/#!msg/querydsl/Geexg_eN2yA/iREXf-DM0nwJ –

Odpowiedz

12

Próbowałeś

QCard qCard = QCard.card; 
List<Card> cards = getQuery().from(qCard) 
    .innerJoin(qCard.person).fetch() 
    .list(qCard); 
+0

Oryginalnie próbowałem innerJoin z fetchAll. Dowiedziałem się, że kombinacja leftJoin z pobieraniem utworów. Nie jestem pewien, czy tak jest, czy też problem polegał na buforowaniu. – Marko

+0

Proszę wpisać swój kod roboczy do odpowiedzi i oznaczyć ten problem jako rozwiązany. –

+0

Odpowiedź Timo jest aktualna. Osoba jest pobierana z entuzjazmem, jeśli używam funkcji fetch(), ale nie, jeśli używam metody fetchAll(). – Marko