Значение запроса JoinColumn с JPQL
У меня есть два JPA лица
public class Job {
@ManyToOne
@JoinColumn(name = "service")
public Service service;
@Column(name = "queue_time")
public Long queueTime;
@Column(name = "run_time")
public Long runTime;
}
public class Service {
@Id
@Column(name = "id")
public Long id;
@Column(name = "name")
public String name;
@Column(name = "host")
public String host;
}
Теперь я хочу сделать несколько запросов агрегации с JPQL:
SELECT job.service.id, AVG(job.queueTime), AVG(job.runTime) FROM Job job GROUP BY job.service.id
Результирующий запрос SQL (я использую базу данных MySQL) выглядит следующим образом:
SELECT t0.id, AVG(t1.queueTime), AVG(t1.runTime) FROM Service t0, Job t1 WHERE (t0.service = t1.id) GROUP BY t0.id
Как видите, JPA переводит мой JPQL-запрос в SQL-запрос с объединением. Это, однако, значительно замедляет запрос. Следующий SQL-запрос выполняется в 6 раз быстрее и возвращает точно такой же набор результатов:
SELECT t1.service, AVG(t1.queueTime), AVG(t1.runTime) FROM Job t1 GROUP BY t1.service
Если я изменю запрос JPQL на
SELECT job.service, AVG(job.queueTime), AVG(job.runTime) FROM Job job GROUP BY job.service
результирующий запрос SQL выглядит так:
SELECT t0.id, t0.name, t0.host AVG(t1.queueTime), AVG(t1.runTime) FROM Service t0, Job t1 WHERE (t0.service = t1.id) GROUP BY t0.id, t0.name, t0.host
Есть ли способ написать JPQL, который только запрашивает таблицу заданий, не делая соединение с таблицей услуг?
1 ответ
Этот вопрос решил проблему для меня: как я могу получить внешний ключ из сопоставления JPA ManyToOne, не обращаясь к целевой таблице?
Я принял второе решение (б) Использовать поля только для чтения для FKs)