私は次の架空の問題で立ち往生しています:
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
が少なくとも1つあるを選択するにはどうすればよいですか?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()]));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加