2012-02-21 24 views
18

Bu örnekte üzerine "Dynamic, typesafe queries in JPA 2.0" makale okuma ve tökezledi edildi:Sınıf adıyla birleştirilen alt çizgi nedir?

EntityManager em = ... 
CriteriaBuilder qb = em.getCriteriaBuilder(); 
CriteriaQuery<Person> c = qb.createQuery(Person.class); 
Root<Person> p = c.from(Person.class); 
Predicate condition = qb.gt(p.get(Person_.age), 20); 
//          ^^ --- this one 
c.where(condition); 
TypedQuery<Person> q = em.createQuery(c); 
List<Person> result = q.getResultList(); 

merak ediyorum, tam olarak burada çizgi ne anlama geliyor?

Alt çizgiden beri, bir sınıf adının geçerli bir parçası olduğundan, neden bunun JPA'da kullanılabileceğini anlamıyorum. Bunu kodumdaki var olan bir varlıkla kontrol ettim ve tabiki benim dersim ClassName_

+0

Bu yazının sorumlusunu da yazabilirsiniz: yazar :) – Jayy

cevap

15

Çözünürlük için çözülemedi. Bu, metamodel. Java'da güvenli JPA sorguları nasıl yazabilirsiniz. Bar_ sınıfı, JPA Bar'nuzu tanımladığından, sorgularınızın statik olarak sorgulanmasını sağlar. HQL'de, bir sorguyu kolaylıkla yazabilir ve çalıştırılıncaya kadar bilmeyebilirsiniz.

Teknik açıdan, _ hiçbir anlam ifade etmemektedir, ancak JPA tarafından kullanılan bir JPA kalıcı model sınıfının bir metamodel sınıfını adlandırmak için kullanılan kuraldır., Model metamodelidir ve sorgulanabilir alanların adlarını ve türlerini sağlar.

+0

Başka bir maven bağımlılığı eklemek zorunda mıyım? 'Bar_' şu anda olmayan derleyici tarafından bilinmelidir. – stacker

+1

Metamodel'i elle yazabilir, üretebilir ve daha sonra dosyaları el ile kopyalayabilir ya da Maven yapınıza dahil edebilirsiniz. [Bu Maven eklentisi] 'ni (http://janistoolbox.typepad.com/blog/2010/03/java-persistency-api-20-jpa-hibernate-jpa-metamodel-generator-maven-1.html) bulabilirim. işi yap. – ArtB

+0

@stacker bu eklenti yardımını yaptı mı? Eğer öyleyse cevapın kendisine ekleyeceğim. – ArtB

0

Bu article içinde metamodel bildirmek için bu yolu buldum.

/** 
* A meta model class used to create type safe queries from person 
* information. 
* @author Petri Kainulainen 
*/ 
@StaticMetamodel(Person.class) 
public class Person_ { 
    public static volatile SingularAttribute<Person, String> lastName; 
} 
+0

Bu, el ile yaparak kastettiğim şey. :) Eminim, 'StaticMetamodel' ek açıklamalarına sahip olduğunuz sürece, gerçek sınıfı istediğiniz gibi adlandırabilirsiniz. – ArtB

İlgili konular