[英]Select query with JPA Criteria API When Entity class has a child class (Embeddable id)
[英]How to select a JPA Entity by whitelisting a property of its child Entity with the Criteria API?
我堅持以下假設問題:
使用Criteria API (而不是JPQL ),並給出
一個充滿用戶的桌子,每個用戶都有多輛車
@Entity public class User { @Id private Long id; @OneToMany private Set<Car> cars; }
@Entity public class Car { @Id private Long id; private String model; }
包含汽車模型的 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.