У меня есть две таблицы с ассоциацией one-to-many
:
Student Subject
------------ ----------------------
ID|name|age ID | Student_FK | name
------------ ----------------------
С учеником может быть связано любое количество предметов. (тоже без предметов). Теперь я хочу, чтобы все студенты
subject.name = 'PHYSICS' ИЛИ вообще без темы (NULL)
Я использую QueryBuilder и предикаты для создания запроса, ниже приведен фрагмент кода.
CriteriaBuilder cb = mEntityManager.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(mEntityClass);
Root root = cq.from(mEntityClass);
cq.select(root);
List<String> subjectList = new ArrayList<>();
subjectList.add("PHYSICS");
Join subjectJoin= root.join("subjects", JoinType.LEFT);
Predicate predicate1 = subjectJoin.get("name").in(subjectList);
Predicate predicate2 = subjectJoin.get("name").isNull();
Predicate predicate = cb.or(predicate1,predicate2);
predicates.add(predicate);
cq.where(predicates.toArray(new Predicate[] {}));
Когда я делаю mEntityManager.createQuery(cq).getResultList()
. Я получаю ошибку как -
внешнее соединение старого стиля (+) не может использоваться с соединениями ANSI
Итак, мой вопрос -
- Как получить ЛЕВОЕ соединение с помощью CritariaQuery?
- Есть ли другой способ получить список всех студентов (как с предметами, так и без предмета)?
IN
тоже кажется неправильным: можно использоватьList<String>
, добавить имя субъекта и делать то, что вы делаете сейчас. - person Nikos Paraskevopoulos   schedule 30.01.2017