JPA标准-使用where子句获取

报童

我有以下查询,它工作正常:

public ContractorContractor findContractorByName(String contractorName) {
   CriteriaBuilder builder = em.getCriteriaBuilder();
   CriteriaQuery<ContractorContractor> query = builder.createQuery(ContractorContractor.class);
   Root<ContractorContractor> root = query.from(ContractorContractor.class);
   query.select(root).distinct(true);

   Predicate namePredicate = builder.like(root.get(ContractorContractor_.name), contractorName);
   query.where(builder.and(namePredicate));

   return em.createQuery(query).getSingleResult();
}

上面的查询按名称给了我一个承包商或引发异常。现在,我想做同样的事情,但是获得有关承包商的更多信息(将获取内容添加到承包商的另一个子项中),但是在以下查询中我没有得到结果(org.springframework.dao.EmptyResultDataAccessException:未找到查询结果) 。使用提取查询:

public ContractorContractor findContractorByName(String contractorName) {
   CriteriaBuilder builder = em.getCriteriaBuilder();
   CriteriaQuery<ContractorContractor> query = builder.createQuery(ContractorContractor.class);
   Root<ContractorContractor> root = query.from(ContractorContractor.class);
   root.fetch(ContractorContractor_.countries);
   query.select(root).distinct(true);

   Predicate namePredicate = builder.like(root.get(ContractorContractor_.name), contractorName);
   query.where(builder.and(namePredicate));

   return em.createQuery(query).getSingleResult();
}

谁能告诉我我在做什么错,为什么在上面的查询中?

8小时制

您似乎通过添加内部访存联接并添加以下语句意外地限制了查询的域

root.fetch(ContractorContractor_.countries);

根据JPA 2.1,JSR 338第6.5.4节

[...]提取联接与相应的内部联接或外部联接具有相同的联接语义[...]

因此,将隐式内部访存联接JoinType.INNER)更改为(外部)左访存联接应该可以解决您的问题:

root.fetch(ContractorContractor_.countries, JoinType.LEFT);

这种副作用似乎有点出乎意料,这可能是规范作者添加以下注释的原因(尽管在标准连接的情况下,见第4.4.7节):

应用程序开发人员在定义标识变量时应格外小心,因为查询的域可能取决于所声明类型的值是否存在

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章