2017-05-26 8 views
0

MySQLでJava8とHibernate 5.2.1およびJPA2を使用しています。2つのパラメータを持つHibernate CriteriaBuilder

私は完璧に動作し、次のクエリを持っている:

final EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory(); 
    final CriteriaBuilder criteriaBuilder = entityManagerFactory.getCriteriaBuilder(); 
    CriteriaQuery<Rating> criteria = criteriaBuilder.createQuery(Rating.class); 
    Root<Rating> root = criteria.from(Rating.class); 
    ParameterExpression<Job> paramJob = criteriaBuilder.parameter(Job.class); 

    criteria.select(root).where(criteriaBuilder.equal(root.get("job"), paramJob)); 

あなたが見ることができるように、クエリは一つのパラメータparamJobを持っています。

ParameterExpression<Person> paramPerson = criteriaBuilder.parameter(Person.class); 

質問私は2番目のパラメータに対応するために、以下の行を変更するにはどうすればよい

:私は2番目のパラメータを追加したいと思いますか?

criteria.select(root).where(criteriaBuilder.equal(root.get("job"), paramJob)); 

私はちょうど二行追加することができます。

criteria.select(root).where(
    criteriaBuilder.equal(root.get("job"), paramJob), 
    criteriaBuilder.equal(root.get("person"), paramPerson) 
); 

答えて

1

をこれを試してみてください。あなたはいくつかのことを調整する必要がありますが、この方法で動的なwhere節を設定することもできます:

final EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory(); 
final CriteriaBuilder criteriaBuilder = entityManagerFactory.getCriteriaBuilder(); 
CriteriaQuery<Rating> criteria = criteriaBuilder.createQuery(Rating.class); 
Root<Rating> root = criteria.from(Rating.class); 
List<Predicate> predicates = new ArrayList<Predicate>(); 

predicates.add(criteriaBuilder.equal(root.get("job"), Job.class)); //might need to change ther Person.class to whatever matches the job 
predicates.add(criteriaBuilder.equal(root.get("person"), paramPerson)); //same as above 
criteria.select(root).where(predicates.toArray(new Predicate[]{})); 
//execute query 
+0

ありがとうございました。これを正解とマークします。 – Richard

1

私の目には、より動的なアプローチ:

criteria.select(root).where(criteriaBuilder.equal(root.get("person"), paramPerson)); 

おかげ

関連する問題