[英]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.