Issue
Suppose an entity model where an Employee
has a Supervisor
who has an id
. Using hibernate-jpamodelgen
to generate the meta model for the entities, how can I query a nested field?
For instance, "get all employees whose supervisor has id 4", using JpaSpecificationExecutor
:
Page<Employee> getEmployeesBySupervisorId(int id) {
return findAll((root, query, criteriaBuilder) -> {
return criteriaBuilder.equal(root.get(Employee_.supervisor.id), id);
});
}
Note that Employee_
is the model meta class for Employee
(and was generated by Hibernate).
This code will produce an error because the id
symbol cannot be found on type SingularAttribute<Employee, Supervisor>
. I get that, but it seems like these should somehow be chainable. I can't find great examples of how to do this cleanly.
Solution
In order to navigate to related entities, you must use From#join()
join method, which works well with MetaModel:
CriteriaQuery<Employee> cq = criteriaBuilder.createQuery(Employee.class);
Root<Employee> from = cq.from(Employee.class);
Predicate p = criteriaBuilder.equal(from.join(Employee_.supervisor).get(Supervisor_.id), id);
See also
Answered By - perissf
Answer Checked By - Terry (JavaFixing Volunteer)