Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate CriteriaBuilder with two parameters

I am using Java8 with Hibernate 5.2.1 and JPA2 with MySQL.

I have the following query that works perfectly:

    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));

As you can see, the query has one parameter paramJob. I would like to add a second parameter:

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

Question

How do I modify the following line to accommodate the second parameter?

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

Can I just add a second line:

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

Thanks

like image 547
Richard Avatar asked Dec 11 '22 11:12

Richard


2 Answers

try this:

criteria.select(root).where(
    criteriaBuilder.equal(root.get("job"), paramJob),
    criteriaBuilder.equal(root.get("person"), paramPerson)
);
like image 197
Piotr Rogowski Avatar answered Dec 12 '22 23:12

Piotr Rogowski


a more dynamic approach in my eyes. you will have to adjust some things, but this way you can also set up a dynamic where clause:

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
like image 45
XtremeBaumer Avatar answered Dec 12 '22 23:12

XtremeBaumer