2012-02-21 14 views
18

Stavo leggendo l'articolo "Dynamic, typesafe queries in JPA 2.0" e d'imbatterci in questo esempio:Cosa significa un trattino basso concatenato con un nome di classe?

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

mi chiedevo, cosa fa esattamente la sottolineatura qui significa?

Poiché un trattino basso è una parte valida di un nome classe, non capisco perché questo possa essere utilizzato in JPA. ho controllato questo con un'entità esistente nel mio codice e, naturalmente, la mia classe non può essere risolto come ClassName_

+0

È inoltre possibile porre questa domanda all'autore dell'articolo :) – Jayy

risposta

15

Questa è la metamodel per la persistenza. È come puoi digitare query JPA sicure in Java. Consente alle query di controllare in modo statico le query poiché la classe Bar_ descrive JPA Bar. In HQL, puoi facilmente mistificare una query e non conoscerla fino a quando non viene eseguita.

Quindi tecnicamente, lo _ non significa nulla, ma è la convenzione utilizzata da JPA per denominare una classe metamodel di una classe di modello persistente JPA. Model_ è il metamodello di Model e fornisce i nomi dei campi interrogabili e dei relativi tipi.

+0

Devo includere un'altra dipendenza di tipo Maven? Il 'Bar_' deve essere conosciuto dal compilatore che non è attualmente il caso. – stacker

+1

Bene, puoi scrivere a mano il metamodello, farlo generare e quindi copiare manualmente i file o incorporarlo nel tuo build Maven. Ho trovato [questo plugin Maven] (http://janistoolbox.typepad.com/blog/2010/03/java-persistency-api-20-jpa-hibernate-jpa-metamodel-generator-maven-1.html) che potrebbe Fai il lavoro. – ArtB

+0

@stacker ha fatto la guida del plug-in? Se è così lo aggiungerò alla risposta stessa. – ArtB

0

Ho trovato questo modo per dichiarare il metamodello in questo 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

Questo è ciò a cui mi riferivo facendolo a mano. :) Sono abbastanza sicuro che finché avrai l'annotazione '@ StaticMetamodel' puoi nominare la classe attuale come preferisci. – ArtB

Problemi correlati