Criteria APIを使用して子エンティティのプロパティをホワイトリストに登録してJPAエンティティを選択するにはどうすればよいですか?

アンドレア・リギオス

私は次の架空の問題で立ち往生しています:

Criteria APIJPQLではなくを使用して、

  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少なくとも1つあるを選択するにはどうすればよいですか?modelmodels

私は多くの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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ