преобразование sql запроса в jpa - PullRequest
1 голос
/ 21 октября 2011

У меня есть запрос

SELECT d.name, count(e.id) FROM department d LEFT OUTER JOIN employee e on e.department_id = d.id and e.salary > 5000

и как я могу преобразовать это в JPA сейчас у меня есть:

CriteriaQuery<Object[]> criteria = builder.createQuery(Object[].class); 
Root<Department> root = criteria.from(Department.class);
Path<String> name = root.get("name");
Expression<Long> empCount = builder.count(root.get("employees").get("id"));
criteria.multiselect(name,empCount);
TypedQuery<Object[]> query = em.createQuery(criteria);

Я упростил оба примера, убрав упорядочение и группировку Может кто-нибудь сказать мне, как я могу изменить свой jpa-код, чтобы получить те же результаты, как из моего SQL-запроса

заранее спасибо

1 Ответ

2 голосов
/ 21 октября 2011

Ты недалеко от результата. Проблема в том, что, AFAIK, вы не можете добавлять какие-либо ограничения в предложение on, используя JPA. Таким образом, запрос должен быть переписан как

SELECT d.name, count(e.id) FROM department d 
LEFT OUTER JOIN employee e on e.department_id = d.id 
where (e.id is null or e.salary > 5000)

Вот эквивалент этого не проверенного запроса):

CriteriaQuery<Object[]> criteria = builder.createQuery(Object[].class); 
Root<Department> root = criteria.from(Department.class);
Path<String> name = root.get("name");

Join<Department, Employee> employee = root.join("employees", JoinType.LEFT);

Expression<Long> empCount = builder.count(employee.get("id"));
criteria.multiselect(name,empCount);
criteria.where(builder.or(builder.isNull(employee.get("id")),
                          builder.gt(employee.get("salary"), 5000)));

TypedQuery<Object[]> query = em.createQuery(criteria);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...