Я хочу выполнить запрос, соответствующий определенному свойству подкласса, поэтому я пытаюсь использовать treat()
.Свойства подкласса API-запроса JPA
В этом примере я хочу:
все предметы с именем, начинающимся с «а»,
или все предметы, которые являются лицами, с фамилией на букву «а»
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
расширяет Subject
, Subject
является абстрактным, наследование SINGLE_TABLE
, и (без влияния).Subject
имеют @DiscriminatorOptions(force = true)
для другого REAS ons
Но сгенерированный 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%')
Есть ли способ, чтобы получить ожидаемый запрос с использованием критериев строитель?
Обратите внимание, что
- с использованием другого корня -
q.from(Person.class)
- с использованием подзапросов -
q.subquery(Person.class)
- двигающейся LastName поля до Темы
- с помощью Native запросов
- с использованием диаграмм сущностей
не принимаются.
Я заинтересован в то, что может быть объявлена и используется непосредственно в WHERE условие (производится только из CriteriaBuilder и/или одного корня, так же, как п treat()
), если он делает существовать.
Доступ к * Customer_.name *, который совпадает с * Contact_.name *. он не будет работать, если вы используете свойство, определенное на * Клиент *, и результат в ошибке компиляции * Метод get (SingularAttribute super Contact, Y>) в типе Path не применим для аргументов (SingularAttribute ) * –
См. Мое обновление, если вы опускаете тип корня, который не возникает. – user993553
Вы возитесь с чем-то, что мало связано с метамодельным переводом запросов ... но ваше обновление указало мне в правильном направлении. Хотя это не стоит щедрости или принятия, все равно стоит пара +1. Благодарю. –