gpt4 book ai didi

sql - 我什么时候应该支持 JOIN 而不是单一属性中的属性访问?

转载 作者:行者123 更新时间:2023-12-04 06:07:30 25 4
gpt4 key购买 nike

考虑以下实体:

@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 或 Criteria API 的 join(-) 方法中)?
- 这两种方法的优点/缺点是什么?
- 其中一个被认为比另一个更有效吗?
- 如果只是风格问题 - 你更喜欢哪一个,为什么?

最佳答案

  • 我只是考虑属性的类型。 e.computer是一台计算机,因此我可以调用getModel()就可以了,所以e.computer.model没关系。 e.projects是一个列表,我不能调用 getName()在列表中,所以 e.projects.name不行。每次需要访问集合成员时都需要加入。
  • 使用 e.computer.id 时,不需要 SQL 连接(至少 Hibernate 不会生成),因为计算机的 ID 在员工表中,作为外键。因此,使用它比使用显式连接更有效。 e.computer.model生成一个 SQL 连接,这只是风格和偏好的问题。
  • 见 2。
  • 我通常更喜欢显式连接,因为...它使它们显式。如果需要,将它们转换为左连接也更容易。
  • 关于sql - 我什么时候应该支持 JOIN 而不是单一属性中的属性访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8183032/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com