2016-03-23 22 views
0

Çok basit bir sorum var ama doğru çözümü bulamıyorum. JPAEntity'in tüm kayıtlarını okumak için JPAEntity sınıfına yalnızca bir referansa sahip bir CriteriaQuery kullanarak okumak istiyorum.Farklı Nesneler İçin KriterlerQuery

folowing Kod çalışır ve ne istiyorum yapar:

private void test(Field jpaField) { 
    List l; 
    final Class c = jpaField.getType(); 

    final CriteriaQuery criteriaQuery = em.getCriteriaBuilder().createQuery(c); 
    criteriaQuery.select(criteriaQuery.from(c)); 
    l = em.createQuery(criteriaQuery).getResultList(); 

    ... 
} 

Ama tip safty ilgili birçok uyarı olsun. Ben jenerik kalırken bu sorunu çözmek için aşağıdaki düzeltme çalıştı:

private void test(Field jpaField) { 
    List<?> l; 
    final Class<?> c = jpaField.getType(); 

    final CriteriaQuery<?> criteriaQuery = em.getCriteriaBuilder().createQuery(c); 
    criteriaQuery.select(criteriaQuery.from(c)); 
    l = em.createQuery(criteriaQuery).getResultList(); 

    ... 
} 

Ama şimdi unmatching türleri hakkında hataları olsun. Sanırım bir şekilde yaratıyorum ki Query (c) ve (c) 'nin aynı tipini kullanması gerekiyor. Ama nasıl olduğunu bilmiyorum. Bu kalıbı nasıl kullanacağını bilen var mı?

Herhangi bir ipucu için teşekkür ederiz.

Saygılarımızla, Dominic

+0

Ancak "Alan" bir "Varlık" değil midir? –

+0

Şu an açıklamada eksik bir şey var: Bu örnekte jpaField, diğer bir varlığa işaret eden bir ManyToOne Alanıdır. Bu nedenle jpaField.getType() ve sonuç olarak değişken c bir JPA-Varlığıdır. Sahayı unutabilir ve sadece Sınıf c'yi bir JPA Entity sınıfı olarak kabul edebilirsiniz. Bunun için üzgünüm. Wirtten: Kod, türlerini belirtmeye çalışmadığım sürece çalışır ancak uyarılarla .. – Dominic

cevap

1

olarak işaret edilmiş, bir jenerik findAll yöntemin imza

<T> List<T> findAll(Class<T> entity) 

Ben conceptualize zor kısmı Class<T> entity olduğunu düşünüyorum.

<T> CriteriaQuery<T> createQuery(Class<T> resultClass) 

Yani genel bir findAll yöntem şöyle yazılır:

public <T> List<T> findAll(Class<T> entity) { 
    CriteriaQuery<T> q = em.getCriteriaBuilder().createQuery(entity); 
    q.select(q.from(entity)); 
    return em.createQuery(q).getResultList(); 
} 

şöyle Kullanılan:

Ama createQuery imzası bakarsanız bunu temelde aynı olduğunu göreceksiniz
findAll(entity.getClass()); 

Bir çalışma zamanı nesnesi olduğu ve jeneriklerin derleme zaman kısıtlamaları olduğu için genel bir yöntem nesnesinin kendisinden geçemezsiniz.

+0

"Genel bir yöntemi geçemezsiniz varlık kendisi çünkü bir çalışma zamanı nesnesi ve jenerikler derleme zaman kısıtlamalarıdır. " Bunu biliyorum ve bu yüzden problemim çünkü tasarım zamanında dersim yok! Bu uyarıları olmadan bunu yapmak mümkün olmalıdır .. – Dominic

+0

'getClass()' çağıranın nesi yanlış? –

0

Bir Methode desgin soru. Belki de getType() yöntemini metodu dışında arayabilirsin?

private <T> List<T> test(Class<T> jpaFieldClass) .... 
+0

Tasarım zamanında hiçbir zaman belirli bir Varlık Sınıfına sahip değilim, bu nedenle kodu genel olarak kapsüllemek mümkün değil. Sorun, Varlık Sınıfı'nı nereden aldığımla ilgili değil - bir şeyden bir varlık sınıfım varsa, uyarıları olmadan bir Kriteri Sorgusu kullanarak tüm kayıtları nasıl okuyabilirim ... – Dominic

İlgili konular