In Sun Online resources, they provide开发者_JAVA技巧 son example about the usage of the Criteria/Metamodel API, but as far as I understand Java, it seems to be impossible to work:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
EntityType<Owner> Owner_ = m.entity(Owner.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Owner, Address> address = cq.join(**Pet_.owners**).join(**Owner_.addresses**);
Pet_
is a instance of class EntityType
which doesn't define any attribute named owners
or addresses
.
They do define classes named Pet_
and Owner_
for the metamodel, but they importation here would create a conflict with the variable names ... Am I right?
__
(the question is also related to this one)
This example is incorrect, the authors are mixing canonical static metamodel classes (generated) with classes obtained via the Metamodel API. They are supposed to use either the weakly typed API or the stronlgy typed generated classes, not both together. In their case, the Pet_
(which is an incredible bad naming choice and is misleading) indeed doesn't have any owners
attribute.
This should be reported, this part of the tutorial is misleading and wrong.
See also
- Dynamic, typesafe queries in JPA 2.0
精彩评论