Java 使用JPA标准API为联接表添加where子句

Java 使用JPA标准API为联接表添加where子句,java,hibernate,criteria-api,Java,Hibernate,Criteria Api,我在vocab和vocabml之间有一对多的关联 使用简单查询需要做什么(连接两个表并根据描述条件进行筛选): 我尝试使用criteria API引发异常:原因:java.lang.IllegalStateException:非法尝试取消引用基本类型的路径源[null.vocabmls] 我的代码: CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery<Vocab> criteriaQu

我在vocab和vocabml之间有一对多的关联

使用简单查询需要做什么(连接两个表并根据描述条件进行筛选):

我尝试使用criteria API引发异常:
原因:java.lang.IllegalStateException:非法尝试取消引用基本类型的路径源[null.vocabmls]

我的代码:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Vocab> criteriaQuery = builder.createQuery(Vocab.class);
criteriaQuery.distinct(true);

Root<Vocab> root = criteriaQuery.from(Vocab.class);
root.fetch("vocabmls", JoinType.LEFT);

List<Predicate> predicates = = new ArrayList<>();


Predicate predicate = builder.or(builder.like(root.get("description"), "%" + description + "%"),
                      builder.like(root.get("vocabmls").get("description"), "%" + description + "%"));
predicates.add(predicate)

if(locales != null){
    List<String> ids = locales.stream().map(Locale::getId).collect(Collectors.toList());
    Join<Vocab, Vocabml> vocabmlJoin = root.join("vocabmls", JoinType.LEFT);
    vocabmlJoin.on(builder.and(vocabmlJoin.<Vocabml> get("localeId").in(ids)));
}

criteriaQuery.where(predicates.toArray(new Predicate[] {})).orderBy(builder.asc(root.get("description")));
return entityManager.createQuery(criteriaQuery).getResultList();
CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(Vocab.class);
criteriaQuery.distinct(true);
Root=criteriaQuery.from(Vocab.class);
fetch(“vocabmls”,JoinType.LEFT);
列表谓词==新的ArrayList();
谓词谓词=builder.or(builder.like(root.get(“description”),“%”+description+“%”),
builder.like(root.get(“vocabmls”).get(“description”),“%”+description+“%”);
谓词.add(谓词)
如果(区域设置!=null){
List id=locales.stream().map(Locale::getId).collect(Collectors.toList());
Join vocabmlJoin=root.Join(“vocabmls”,JoinType.LEFT);
on(builder.and(vocabmlJoin.get(“localeId”).in(id));
}
where(predicates.toArray(newpredicate[]{})).orderBy(builder.asc(root.get(“description”));
返回entityManager.createQuery(criteriaQuery.getResultList();

我是这样解决的,需要使用join添加条件

Predicate predicateJoin = builder.equal(vocabmlJoin.get("description"), description);
predicates.add(predicateJoin);
它将简单地添加
,其中vm.description=

我也改变了这一个是或不是和

 criteriaQuery.where(builder.or(predicates.toArray(new Predicate[] {})))

我是这样解决的,需要使用join添加条件

Predicate predicateJoin = builder.equal(vocabmlJoin.get("description"), description);
predicates.add(predicateJoin);
它将简单地添加
,其中vm.description=

我也改变了这一个是或不是和

 criteriaQuery.where(builder.or(predicates.toArray(new Predicate[] {})))

您可以复制完整堆栈跟踪以查看哪一行引发异常吗?它不喜欢这一行root.get(“vocabmls”).get(“description”)您可以复制完整堆栈跟踪以查看哪一行引发异常吗?它不喜欢这一行root.get(“vocabmls”).get(“description”)