Когда следует отдавать предпочтение JOIN вместо доступа к атрибутам в единичных атрибутах? - PullRequest
2 голосов
/ 18 ноября 2011

Рассмотрим следующую сущность:

@Entity
public class Employee {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    // Assume that Project has a 'name' property
    @OneToMany(mappedBy = "manager")
    private List<Project> projects;

    @OneToOne
    private Department department;

    // Assume that Computer has a 'model' property
    @ManyToOne
    private Computer computer;

    //...
}

Я хочу получить все Project имена для данного Employee.

Чтобы сделать это,Мне нужно сделать JOIN, поэтому:

// JPQL query
SELECT p.name FROM Employee e JOIN e.projects p

// Criteria API equivalent (pseudo-code)
Root<Employee> emp = CriteriaQuery#from(Employee.class);
CriteriaQuery#select(emp.get(Employee_.projects).get(Project_.name));

И эти запросы в порядке.

Однако я не могу сделать:

// JPQL query
SELECT e.projects.name FROM Employee e

// Criteria API equivalent (pseudo-code)
Root<Employee> emp = CriteriaQuery#from(Employee.class);
Join<Employee, Project> empProj = emp.join(Employee_.projects);
CriteriaQuery#select(empProj.get(Project_.name));

Поскольку спецификация JPA 2.0 запрещает использовать не единственную идентификационную переменную.

Однако , для единичных атрибутов я могу получить к ним доступ с помощью JOIN или просто перейти к ним с помощью идентификационной переменной, поэтомувсе следующие запросы действительны и возвращают одинаковый результат:

SELECT e.computer.model FROM Employee e
SELECT c.model FROM Employee e JOIN e.computer c

// Criteria API equivalents of the above JPQL (pseudo-code)
Root<Employee> emp = CriteriaQuery#from(Employee.class);
Join<Employee, Computer> empComp = emp.join(Employee_.computer);
CriteriaQuery#select(empComp.get(Computer_.model));

Root<Employee> emp = CriteriaQuery#from(Employee.class);
CriteriaQuery#select(emp.get(Employee_.computer).get(Computer_.model));

Мои вопросы:
- когда мне следует использовать явное JOIN (либо в JPQL, либоКритерий API метод join (-)?
- каковы преимущества / недостатки обоих подходов?
- считается ли один из них более эффективным, чем другой?
- если это просто вопрос стиля -какой бы вы предпочли и почему?

1 Ответ

2 голосов
/ 18 ноября 2011
  1. Я просто думаю о типе атрибута. e.computer - это компьютер, и поэтому я могу вызвать на нем getModel(), поэтому e.computer.model в порядке. e.projects - это список, и я не могу вызвать getName() в списке, поэтому e.projects.name не в порядке. Вы должны объединяться каждый раз, когда вам нужен доступ к члену коллекции.

  2. При использовании e.computer.id объединение SQL не требуется (и не генерируется, по крайней мере, в Hibernate), поскольку идентификатор компьютера находится в таблице сотрудников в качестве внешнего ключа. Таким образом, его использование более эффективно, чем использование явного соединения. e.computer.model создает соединение SQL, и это просто вопрос стиля и предпочтений.

  3. См. 2.

  4. Я обычно предпочитаю явные объединения, потому что ... это делает их явными. Также при необходимости проще преобразовать их в левые соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...