Я хочу выполнить запрос, соответствующий определенному свойству подкласса, поэтому я пытаюсь использовать treat().
В этом примере я хочу:
все темы с именем, начинающимся с 'a',
или все предметы, которые являются людьми, с фамилией, начинающейся с '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();
}
Очевидно, что Person extends Subject, Subject является абстрактным, наследование SINGLE_TABLE, и (без влияния).Subject имеет @DiscriminatorOptions(force = true) по другим причинам
Но сгенерированный SQL это:
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%')
пока я ожидаю:
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%')
Есть ли способ создать ожидаемый запрос с помощью построителя критериев?
Обратите внимание, что
- с использованием другого Root -
q.from(Person.class) - с помощью подзапросов -
q.subquery(Person.class) - перемещение поля lastName до темы
- с использованием собственных запросов
- с использованием диаграмм сущностей
неприемлемы.
Мне интересно то, что может быть объявлено и использовано непосредственно в предложении WHERE (, выпущенном только из CriteriaBuilder и/или одиночного Root, как и предложение treat()), если оно существует.