簡體   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