Wie finden Sie eine Unterklasse spezifisches Feld in einer CriteriaQuery, wo der super-Klasse abgefragt wird?
Ich versuche, etwas zu erreichen, wie die folgenden, mit dem JPA Criteria API:
SELECT b FROM Box b JOIN SpecialItem s WHERE s.specialAttr = :specialAttr
Sind die Objekte
Box
@Entity
public class Box implements Serializable {
...
@ManyToOne
@JoinColumn( name = "item_id" )
Item item;
...
}
Element
@Entity
@Inheritance( strategy = InheritanceType.JOINED )
public class Item implements Serializable {
@Id
private String id;
...
}
SpecialItem
@Entity
public class SpecialItem extends Item {
private String specialAttr;
...
}
Mein Versuch
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery( Box.class );
Root from = cq.from( Box.class );
//Nothing to specify SpecialItem over Item!
Join join = from.join("item", JoinType.LEFT);
//java.lang.IllegalArgumentException: Unable to
//resolve attribute [specialAttr] against path [null]
Path p = join.get( "specialAttr" );
Predicate predicate = cb.equal( p, "specialValue" );
cq.where( predicate );
Nicht überraschend, es wirft eine Ausnahme, weil specialAttr ist nicht ein Mitglied von der Klasse Item.
Wie kann ich wieder alle Box
es enthalten SpecialItem
, wo die SpecialItem.specialAttr
irgendwelchen Wert hat?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn mit JPA 2.1 Sie verwenden könnte
oder
Ich möchte nur zu verlängern, die Antwort von Chris für die Kriterien-API mit den generierten meta-Modell.