LEFT Join не работает с JPA, CriteriaQuery

У меня есть две таблицы с ассоциацией 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

Итак, мой вопрос -

  1. Как получить ЛЕВОЕ соединение с помощью CritariaQuery?
  2. Есть ли другой способ получить список всех студентов (как с предметами, так и без предмета)?

person shubham    schedule 30.01.2017    source источник
comment
Для начала кажется, что вы используете недопустимую комбинацию диалектов Oracle / Hibernate. См., Например, это. Тогда предикат IN тоже кажется неправильным: можно использовать List<String>, добавить имя субъекта и делать то, что вы делаете сейчас.   -  person Nikos Paraskevopoulos    schedule 30.01.2017
comment
Привет, Никос, спасибо, что указал на это. Но меня беспокоит, что изменение конфигурации повлияет и на другие части Codebase. есть ли другой способ добиться этого, не меняя конфиг.?   -  person shubham    schedule 30.01.2017
comment
Я не знаю (и не думаю, что это возможно, за исключением, возможно, собственных запросов).   -  person Nikos Paraskevopoulos    schedule 30.01.2017
comment
Один из ваших предикатов находится в команде, но ни один из ваших столбцов не назван командой.   -  person David Conrad    schedule 30.01.2017
comment
Извините, это была опечатка   -  person shubham    schedule 30.01.2017