2012-01-09 27 views
7

Veritabanımdaki varlıklarımı seçmek için Kriteri API'sı ile JPA2 kullanıyorum. Uygulama, WebSphere Application Server'da OpenJPA'dır. Bütün varlıklarım Fetchtype = Lazy ile modellenmiştir.jpa tembel varlıkları ölçütler api ile birden çok düzeyde getirme

Veritabanından bazı ölçütlere sahip bir varlık seçiyorum ve tüm iç içe geçmiş verileri alt tablolardan bir kerede yüklemek istiyorum. Ben masa Bir tablo B'ye oneToMany katılmış bir datamodel varsa, benim kriterleri sorguda bir Getir-maddesini kullanabilirsiniz: Bu iyi çalışır

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

. Bir A elementi alıyorum ve tüm B elementleri doğru şekilde dolduruldu. Artık B tablonun C tablasına bir oneMonm ilişkisi var ve ben de onları yüklemek istiyorum. Yani benim sorguya aşağıdaki ifadeyi ekleyin:

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

Ama bu alışkanlık her şeyi yaparım.

Tek bir sorguda çok düzeyli varlıkları nasıl getireceğini bilen var mı?

cevap

10

JPQL ile çalışmaz ve bunu da Kriterler Sorgusu'nda çalışmanın bir yolu yoktur. JPQL katılmak Hakkında getirme

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.

:

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.

aynı sınırlamadır

Hakkında CriteriaQuery ile katılmak getirme: Şartname sınırları döndü varlıktan doğrudan başvurulan içinde olanlara varlıkları getirilen ayrıca OpenJPA belgelerinde anlattı.

+0

Cevabınız için çok teşekkürler. Ama işaret ettiğiniz dökümantasyon makalesinde bir JPQL örneği var: 'SELECT x FROM Magazine x birleştirme getir x.articles birleştirme getirme a.publishers p WHERE x.title = 'JDJ' Tablolar x vardır, ve ilişkilerle p => a ve a-> p. Bu tam olarak ölçüt API'siyle yapmak istediğim şey. –

+0

Çok dikkatli okumadınız. Sözdizimi hatasına neden olan sorgu hakkında bir örnektir. Bu sorgudan önceki cümledir: "Aşağıdaki sorgu sözdizimi hatasıyla sonuçlanacaktır:". Ne yapmak istiyorsan işe yaramıyor. –

+3

Oh, haklısın. Yani sadece şunu söyleyebilirim: Ooops. Ama neyse ... Böyle bir sorunu çözebileceğim bir uygulama var mı? Bence bu dünyada ikiden fazla masa almak isteyen çok insan var. İlk önce ikinci masaya katılmalı mıyım yoksa diğer verileri manuel olarak mı okumalıyım? Bunun için en iyi uygulama nedir? –