2012-01-09 40 views
7

Tôi đang sử dụng JPA2 với API tiêu chí của nó để chọn các thực thể của tôi từ cơ sở dữ liệu. Việc triển khai thực hiện OpenJPA trên Máy chủ ứng dụng WebSphere. Tất cả các thực thể của tôi được mô hình hóa với Fetchtype = Lazy.jpa tìm nạp các thực thể trên nhiều cấp độ với tiêu chí api

Tôi chọn một thực thể có một số tiêu chí từ cơ sở dữ liệu và muốn tải tất cả dữ liệu lồng nhau từ các bảng phụ cùng một lúc. Nếu tôi có một DataModel nơi bảng A được tham gia oneToMany bảng B, tôi có thể sử dụng một Fetch-điều khoản trong truy vấn tiêu chí của tôi:

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<A> cq = cb.createQuery(A.class); 
Root<A> root = cq.from(A.class); 
Fetch<A,B> fetch = root.fetch(A_.elementsOfB, JoinType.LEFT); 

này hoạt động tốt. Tôi nhận được một phần tử A và tất cả các phần tử B của nó được điền chính xác. Bây giờ bảng B có mối quan hệ oneToMany với bảng C và tôi cũng muốn tải chúng. Vì vậy, tôi thêm các tuyên bố sau đây để truy vấn của tôi:

Fetch<B,C> fetch2 = fetch.fetch(B_.elementsOfC, JoinType.LEFT); 

Nhưng điều này sẽ không làm gì cả.

Có ai biết cách tìm nạp các thực thể đa cấp trong một truy vấn không?

Trả lời

10

Nó không hoạt động với JPQL và không có cách nào để làm cho nó hoạt động trong CriteriaQueries. giới hạn tiêu chuẩn lấy thực thể để những người thân trong được tham chiếu trực tiếp từ các tổ chức trả về:

Về lấy tham gia với CriteriaQuery:

An association or attribute referenced by the fetch method must be referenced from an entity or embeddable that is returned as the result of the query.

Về lấy tham gia JPQL:

The association referenced by the right side of the FETCH JOIN clause must be an association or ele ment collection that is referenced from an entity or embeddable that is returned as a result of the query.

Cùng hạn chế là cũng đã nói trong tài liệu OpenJPA.

+0

Cảm ơn rất nhiều câu trả lời của bạn. Nhưng có một ví dụ về JPQL trong bài viết tài liệu mà bạn đã chỉ ra: 'SELECT x FROM Magazine x tham gia tìm nạp x.articles một tham gia tìm nạp a.publishers p WHERE x.title = 'JDJ'' Có các bảng x, a và p với các quan hệ x-> a và a-> p. Đây chính xác là những gì tôi muốn làm với API tiêu chí. –

+0

Bạn đã không đọc nó rất cẩn thận. Đây là ví dụ về truy vấn gây ra lỗi cú pháp. Câu trước truy vấn đó là: "Truy vấn sau sẽ dẫn đến lỗi cú pháp:". Những gì bạn muốn làm không hoạt động. –

+3

Ồ, bạn nói đúng. Vì vậy, tôi chỉ có thể nói: Rất tiếc. Nhưng dù sao ... Có thực tế nào tôi có thể giải quyết một vấn đề như vậy không? Tôi nghĩ có rất nhiều người trên thế giới này muốn tìm hơn hai cái bàn. Tôi có phải tham gia bảng thứ hai trước hay tôi nên đọc các dữ liệu khác theo cách thủ công? Thực hành tốt nhất cho điều đó là gì? –

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