2012-06-09 27 views
6

Làm cách nào để thực thi chiến lược tải chậm chỉ dành cho một NamedQuery cụ thể.JPA - Buộc tải Lười biếng chỉ cho một truy vấn nhất định

ví dụ: Xem xét các mã giả bên dưới (chỉ để giải thích các trường hợp) Tôi có một thực thể

@Entity 
class Xyz { 
int a; 
int b; 

@Fetch = EAGER 
Set<ABC> listOfItems; 
} 

Trong trường hợp này, chúng tôi đã tuyên bố LISTOFITEMS là háo hức vời.

Giả sử, tôi có một số NamedQuery (query="getXyz" , name="select x from Xyz x where a=?") Đối với truy vấn này, tôi chỉ cần kết quả là lười biếng, tức là tôi không muốn listOfItems được truy lục.

Những cách mà tôi có thể đạt được chúng là gì? ps: 1. Tôi không muốn thay đổi LISTOFITEMS là Lazy trong lớp Entity 2. Tôi không muốn chọn các lĩnh vực cụ thể trong truy vấn như name="select a,b from Xyz z where a = ? "

Cảm ơn trước những lời đề nghị

+0

Bạn sẽ làm gì với kết quả của NamedQuery? Có thể có lựa chọn thay thế cho những gì bạn đang cố gắng đạt được. – siebz0r

+0

@ siebz0r tôi chỉ muốn các trường cấp đầu tiên hiển thị. Trong khi đó có những màn hình khác, nơi có cần phải lấy bộ .. Trong trường hợp của tôi, tôi muốn cải thiện hiệu suất bằng cách không háo hức lấy chúng. Nếu bạn có bất cứ đề nghị, xin vui lòng chia sẻ. Cảm ơn ! –

+0

Tôi khuyên bạn nên chú thích bộ này là lười. Tại sao điều này không thể? – siebz0r

Trả lời

1

Nếu bạn không muốn tìm nạp Set háo hức bạn phải định nghĩa nó là lười biếng. Tuy nhiên lưu ý rằng việc triển khai được phép tìm nạp háo hức khi bạn chỉ định lười.

Trích dẫn các đặc điểm kỹ thuật:

enum công FetchType kéo dài java.lang.Enum

Định nghĩa chiến lược cho việc lấy dữ liệu từ cơ sở dữ liệu. Chiến lược EAGER là một yêu cầu về thời gian chạy của nhà cung cấp kiên trì mà dữ liệu phải được tải xuống một cách háo hức. Chiến lược LAZY là một gợi ý cho thời gian chạy của nhà cung cấp kiên trì mà dữ liệu sẽ được tìm nạp một cách lười biếng khi nó được truy cập lần đầu tiên. Việc triển khai được phép háo hức tìm nạp dữ liệu mà gợi ý chiến lược LAZY đã được chỉ định.

Nếu bạn tuy nhiên không muốn lấy ví dụ một Set tôi sẽ như một sự thay thế tạo ra một lớp nhỏ để phù hợp với nhu cầu của bạn:

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

Bạn có thể truy vấn cho điều này bằng cách sử dụng TypedQuery:

EntityManager em; 
//.... 
TypedQuery<XyzStub> q = em.createNamedQuery("select x from XyzStub x where x.a = :a", XyzStub.class) 
q.setParameter("a", a); 
Các vấn đề liên quan