繁体   English   中英

如何通过使用Criteria API将其子实体的属性列入白名单来选择JPA实体?

[英]How to select a JPA Entity by whitelisting a property of its child Entity with the Criteria API?

我坚持以下假设问题:

使用Criteria API (而不是JPQL ),并给出

  1. 一个充满用户的桌子,每个用户都有多辆车

     @Entity public class User { @Id private Long id; @OneToMany private Set<Car> cars; } 
     @Entity public class Car { @Id private Long id; private String model; } 
  2. 包含汽车模型的 Set<String>

     Set<String> models = getThousandsOfModels(); 

我怎样才能选择User小号具有至少一个Car ,其model是在models设置?

我已经阅读了许多SO答案,尝试了不同的方式(最有希望的似乎是使用Expression<Collection<String>>创建谓词,使用.in()等)但没有任何效果。

以下代码可以解决问题:

Set<String> models = getHundredsOfModels(); 
if (models.size()>1000) throw new TooManyResultsException(); // Oracle limit

CriteriaBuilder cb          = em.getCriteriaBuilder();
CriteriaQuery<User> cQuery  = cb.createQuery(User.class);
Root<User> user             = cQuery.from(User.class);
List<Predicate> predicates  = new ArrayList<Predicate>();

//  This lines are the trick  ------------------------------------------
Join<User, Car> usersCars   = user.join("cars", JoinType.INNER);
Predicate p                 = usersCars.<String>get("model").in(models);
// ---------------------------------------------------------------------    

predicates.add(p);
cQuery.select(user).where(predicates.toArray(new Predicate[predicates.size()]));

暂无
暂无

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

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