2017-05-26 58 views
0

我正在使用帶有MySQL的Hibernate 5.2.1和JPA2的Java8。具有兩個參數的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); 

問題

如何修改以下行,以適應第二個參數?

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

我可以只添加第二行:

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

感謝

回答

1

試試這個:

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

謝謝你,工作。我會將此標記爲正確答案。 – Richard

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