Рассмотрим следующую сущность:
@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 (-)?
- каковы преимущества / недостатки обоих подходов?
- считается ли один из них более эффективным, чем другой?
- если это просто вопрос стиля -какой бы вы предпочли и почему?