2012-02-21 12 views
18

czytałem artykuł "Dynamic, typesafe queries in JPA 2.0" i natknęliśmy się na ten przykład:Co oznacza wyróżnienie konkatenowane z nazwą klasy?

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

Zastanawiałem się, co dokładnie robi podkreślenia tutaj na myśli?

Ponieważ podkreślenie jest ważną częścią nazwy klasy, nie rozumiem, dlaczego można go użyć w JPA. Sprawdziłem to z istniejącym bytem w moim kodzie i oczywiście moja klasa nie mogła zostać rozwiązana jako ClassName_

+0

Możesz również zadać to pytanie autorowi tego artykułu :) – Jayy

Odpowiedz

15

To jest metamodel dla persistance. W ten sposób można wpisywać bezpieczne zapytania JPA w Javie. Dzięki temu zapytania mogą statycznie sprawdzać twoje zapytania, ponieważ klasa Bar_ opisuje Twoją JPA Bar. W HQL można łatwo błędnie wpisać zapytanie i nie znać go, dopóki nie zostanie uruchomiony.

Technicznie, _ nic nie znaczy, ale jest to konwencja używana przez JPA do nazwania klasy metamodelu trwałej klasy modelu JPA. Model_ to metamodel z Model, który podaje nazwy pól, które można wysyłać i ich typy.

+0

Czy muszę dołączyć do innego uzależnienia od maven? 'Bar_' musi być znany przez kompilator, co nie ma obecnie miejsca. – stacker

+1

Cóż, możesz napisać metamodel ręcznie, wygenerować go, a następnie skopiować ręcznie lub dołączyć do swojej wersji Mavena. Znalazłem [tę wtyczkę Mave] (http://janistoolbox.typepad.com/blog/2010/03/java-persistency-api-20-jpa-hibernate-jpa-metamodel-generator-maven-1.html), która może wykonuj pracę. – ArtB

+0

@stacker zrobił tę pomoc wtyczki? Jeśli tak, dodam go do samej odpowiedzi. – ArtB

0

Znalazłem w ten sposób zadeklarować metamodel w tym article.

/** 
* 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

To właśnie miałem na myśli, robiąc to ręcznie. :) Jestem pewien, że tak długo, jak masz adnotację "@ StaticMetamodel", możesz nazwać rzeczywistą klasę, co tylko chcesz. – ArtB