Ich möchte eine Abfrage ausführen, die einer bestimmten Unterklasseneigenschaft entspricht, also versuche ich treat()
zu verwenden.JPA-Kriterien API-Abfrage-Unterklasseneigenschaft
In diesem Beispiel möchte ich:
alle Probanden mit dem Namen mit 'a' beginnen,
oder alle Themen, die Personen sind, mit Nachnamen beginnend mit 'a'
private List<Subject> q1()
{
CriteriaBuilder b = em.getCriteriaBuilder();
CriteriaQuery<Subject> q = b.createQuery(Subject.class);
Root<Subject> r = q.from(Subject.class);
q.select(r);
q.distinct(true);
q.where(
b.or(
b.like(r.get(Subject_.name), "a%"),
b.like(b.treat(r, Person.class).get(Person_.lastName), "a%")));
return em.createQuery(q).getResultList();
}
Offensichtlich Person
erstreckt Subject
, Subject
abstrakt ist, Vererbung ist SINGLE_TABLE
, und (nicht einfließend).Subject
@DiscriminatorOptions(force = true)
für andere reas hat ons
Aber die generierten SQL ist dies:
select distinct subject0_.ID as ID2_71_, subject0_.CODE as CODE3_71_, ...
from SUBJECT subject0_
where subject0_.DTYPE='Person' and (subject0_.name like 'a%' or subject0_.lastName like 'a%')
während ich erwarte:
select distinct subject0_.ID as ID2_71_, subject0_.CODE as CODE3_71_, ...
from SUBJECT subject0_
where subject0_.name like 'a%' or (subject0_.DTYPE='Person' and subject0_.lastName like 'a%')
Gibt es eine Möglichkeit, die erwartete Abfrage mit Kriterien Builder zu produzieren?
Beachten Sie, dass
- unter Verwendung eines anderen Wurzel-
q.from(Person.class)
- Unterabfragen -
q.subquery(Person.class)
- nachName Feld bis zu Gegenstand
- mit Native Queries bewegen
- Verwendung Entity Graphs
sind nicht akzeptabel.
Ich bin in etwas interessiert, die angegeben werden können und direkt in WHERE Klausel (produziert nur von CriteriaBuilder und/oder die einzelnen Wurzel, genau wie die treat()
Klausel) verwendet wird, wenn es tut existieren.
Sie greifen auf * Customer_.name * zu, was mit * Contact_.name * identisch ist. Es funktioniert nicht, wenn Sie eine Eigenschaft verwenden, die für * Customer * definiert ist und zu einem Kompilierungsfehler führt. * Die Methode get (SingularAttribute super Contact, Y>) im Typ Pfad gilt nicht für die Argumente (SingularAttribute ) * –
Siehe mein Update, wenn Sie den Root-Typ weglassen, dass das Problem nicht auftritt. – user993553
Sie sind mit etwas beschäftigt, das wenig mit Metamodell Query Translation zu tun hat ... aber Ihr Update wies mich in die richtige Richtung. Obwohl es das Kopfgeld oder die Akzeptanz nicht wert ist, ist es trotzdem ein paar +1 wert. Vielen Dank. –