繁体   English   中英

JPA Criteria - 使用where子句获取

[英]JPA Criteria - fetch with where clause

我有以下查询工作正常:

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();
}

以上查询按名称给我单一承包商或抛出异常。 现在我想做同样的事情,但获得有关承包商的更多信息(将fetch添加到承包商的另一个孩子)但是使用以下查询我得不到结果(org.springframework.dao.EmptyResultDataAccessException:没有找到查询的结果被抛出) 。 使用fetch查询:

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();
}

任何人都可以告诉我我做错了什么以及为什么在上面的查询?

通过添加以下语句添加内部提取连接 ,您似乎意外地限制了查询的域:

root.fetch(ContractorContractor_.countries);

根据JPA 2.1,JSR 338,第6.5.4节

[...]获取连接具有相应的内部或外部连接相同的连接语义 [...]

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

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

这种副作用可能看起来有些出乎意料,这可能是规范作者添加以下注释的原因(尽管在标准连接的上下文中,第4.4.7节):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM