JPA Criteria Typsicher?

sebastianb

Erfahrenes Mitglied
Hallo zusammen,

laut JPA2.0 Spezifikationen soll die Criteria API ja bekanntlich durch das statische bzw. dynamische Metamodel Typsicher sein.

Dynamisches Metamodell:
Java:
CriteriaBuilder cb = em.getCriteriaBuilder();

CriteriaQuery<Employee> c = cb.createQuery(Employee.class);

Root<Employee> emp = c.from(Employee.class);

EntityType<Employee> emp_ = em.getMetamodel().entity(Employee.class);

c.select(emp).where(cb.equal(emp.get(emp_.getSingularAttribute("name", String.class)), 1));

Statisches Metamodell:
Java:
CriteriaBuilder cb = em.getCriteriaBuilder();

CriteriaQuery<Employee> c = cb.createQuery(Employee.class);

Root<Employee> emp = c.from(Employee.class);

c.select(emp).where(cb.equal(emp.get(Employee_.name), 1));

Laut meiner Auffasung von Typsicherheit sollte doch eigentlich ein Compilefehler jeweils in der letzten Zeile auftreten, da ich versuche eine equals prüfung zwischen einen String und einem Integer zu machen.
Ein Blick in die Hibernate/JPA Sourcen zeigen, dass bei .equal folgende Methode aufgerufen wird
Java:
public Predicate equal(Expression<?> x, Object y) {...}
und da der zweite Parameter vom Typ Object ist, ist es nun klar warum kein Compilefehler auftritt aber wo ist dann hier bitte die Typsicherheit?

Hibernate Version: 3.6.0 Final

Gruß

Sebastian
 
Zuletzt bearbeitet von einem Moderator:
Hi,

so ich habe mal ein wenig rumprobiert und bin zum Schluss gekommen, dass wenn die Signatur von equal in org.hibernate.ejb.criteria.CriteriaBuilderImpl nicht so aussehen würde
Java:
public Predicate equal(Expression<?> x, Object y)
sondern
Java:
public <T> void equal(Expression<T> name, T type)

zeigt mir der Compiler korrekterweise einen Fehler an, wenn ein falscher Datentyp übergeben wird.
 
jup hab ich bereits ;)

[edit] so ich habe mal ein minimalbeispiel angehängt, welches das oben beschriebenen Verhalten demonstriert.
 

Anhänge

Zuletzt bearbeitet:
Zurück