Значение запроса 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)

Другие вопросы по тегам