Java 左连接不使用JPA、CriteriaQuery

Java 左连接不使用JPA、CriteriaQuery,java,hibernate,jpa,join,predicate,Java,Hibernate,Jpa,Join,Predicate,我有两个表与一对多关联: Student Subject ------------ ---------------------- ID|name|age ID | Student_FK | name ------------ ---------------------- 一个学生可以有任意数量的科目与他相关。(也没有主题)。现在我想让所有的学生 subject.name='PHYSICS'或完全没有主题(空) 我使用QueryBuilder和谓词

我有两个表与
一对多关联:

Student            Subject
------------     ----------------------
ID|name|age      ID | Student_FK | name
------------     ----------------------
一个学生可以有任意数量的科目与他相关。(也没有主题)。现在我想让所有的学生

subject.name='PHYSICS'完全没有主题(空)

我使用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[] {}));
CriteriaBuilder cb=mEntityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(mEntityClass);
根根=cq.from(mEntityClass);
选择(根);
List subjectList=新建ArrayList();
主题列表。添加(“物理学”);
Join subjectJoin=root.Join(“subjects”,JoinType.LEFT);
谓词谓词1=subjectJoin.get(“name”).in(subjectList);
谓词谓词2=subjectJoin.get(“name”).isNull();
谓词=cb.or(谓词1,谓词2);
add(谓词);
cq.where(谓词.toArray(新谓词[]{}));
当我执行
mEntityManager.createQuery(cq.getResultList()
时。我得到的错误是-

旧式外部联接(+)不能与ANSI联接一起使用

所以我的问题是——

  • 如何使用CritariaQuery获得左连接
  • 是否有其他方法获取所有学生列表(包括有科目/无科目)

  • 首先,您似乎使用了无效的Oracle/Hibernate方言组合。见例。然后
    谓词中的
    似乎也错了:可能使用
    列表
    ,添加主语的名称,然后做你现在做的事情。嘿,尼科斯,谢谢你指出这一点。但我担心的是,更改配置也会影响代码库的其他部分。在不更改配置的情况下,是否有其他方法来实现它?我不知道(我认为这是不可能的,除了本机查询)。您的一个谓词位于“team”上,但没有一个列命名为“team”。很抱歉,这是一个输入错误。对于初学者来说,您似乎使用了无效的Oracle/Hibernate方言组合。见例。然后
    谓词中的
    似乎也错了:可能使用
    列表
    ,添加主语的名称,然后做你现在做的事情。嘿,尼科斯,谢谢你指出这一点。但我担心的是,更改配置也会影响代码库的其他部分。在不改变配置的情况下,有没有其他方法来实现它?我不知道(而且我认为这是不可能的,除了本机查询)。您的一个谓词位于“team”上,但没有一个列被命名为“team”。很抱歉,这是一个输入错误