2014-05-13 14 views
7

Tôi có một tình huống trong đó một thực thể Thẻ có khóa ngoài cho một Người.Querydsl đặt chế độ tìm nạp trong truy vấn

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; 
} 
} 

Loại tìm nạp mặc định cho người đó là LAZY. Tôi có thể chỉ định loại tìm nạp cho EAGER trong một truy vấn:

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

Cảm ơn bạn đã được trợ giúp.

+0

Bạn chỉ có thể gọi là 'getPerson() 'phương pháp để tải các đối tượng Person trước khi đối tượng của bạn được tách ra, bạn có một lý do cụ thể để thay đổi kiểu lấy? –

+0

Lý do tôi muốn thay đổi loại tìm nạp là tối ưu hóa truy vấn. Tôi có một trường hợp mà tôi cần phải tải nhiều đối tượng chính nước ngoài. Dường như nó hoạt động chậm. – Marko

+0

Vì vậy, bạn đang tìm kiếm từ khóa 'FETCH' từ JPAQL trong QueryDSL. Đây có phải là những gì bạn đang tìm kiếm không? https://groups.google.com/forum/#!msg/querydsl/Geexg_eN2yA/iREXf-DM0nwJ –

Trả lời

12

Bạn có thử

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

Originaly Tôi đã thử innerJoin với fetchAll. Tôi phát hiện ra rằng sự kết hợp leftJoin với công việc tìm nạp. Không chắc chắn nếu đây là trường hợp hoặc một số bộ nhớ đệm là vấn đề. – Marko

+0

Vui lòng đặt mã hoạt động của bạn vào câu trả lời và đánh dấu sự cố này là đã giải quyết –

+0

Câu trả lời của Timo hoạt động. Người được tìm nạp háo hức nếu tôi sử dụng fetch(), nhưng không phải nếu tôi sử dụng fetchAll(). – Marko

Các vấn đề liên quan