JPA Оптимизация запросов, избегая присоединения к таблице поиска? - PullRequest
5 голосов
/ 07 сентября 2010

Представьте себе таблицу emp :

CREATE TABLE emp
( id           NUMBER
, name         VARCHAR
, dept_code    VARCHAR
)

и таблица отдел :

CREATE TABLE dept
( code         VARCHAR
, name         VARCHAR
)

emp.dept_code ссылается dept.code как ForeignKey.

Эти таблицы сопоставлены с сущностями JPA, а ForeignKey смоделирован как ассоциация:

@ManyToOne
@JoinColumn(name = "dept_code")
private Department department;

Даны следующие данные:

emp                     dept    
----------------        ------------------
1    John   SALS        SALS     Sales
2    Louis  SALS        SUPT     Support
3    Jack   SUPT 
4    Lucy   SUPT  

Я хотел бы написать запрос JPA, который возвращает всех сотрудников в отделе поддержки. Предположим, я знаю PrimaryKey отдела поддержки (SUPT)

Я думаю, это будет:

SELECT emp
  FROM Employee emp JOIN emp.department dept
 WHERE dept.code = 'SUPT'

Вопрос:

Так как код отдела SUPT доступен в таблице emp , есть ли способ переписать запрос JPA , избегая присоединения Департамент образования?

Приведет ли это к повышению производительности? Или реализация JPA (например, Hibernate) достаточно умна, чтобы избежать объединения базы данных с таблицей dept ?

1 Ответ

3 голосов
/ 07 сентября 2010

Вы обычно пишете запрос как

select emp
from employee emp
where emp.department.code = 'SUPT'

и позвольте вашему провайдеру найти наилучший способ получить результат. В случае гибернации, да, он достаточно умен, чтобы понять, что он может просто взглянуть на столбец соединения.

edit: Стоит отметить, что вы не настроили ленивую загрузку в своих аннотациях, так что она все равно присоединится к таблице для создания сущности отдела:)

...