【发布时间】:2016-02-16 07:03:21
【问题描述】:
我制作了一个非常简单的项目,其中包含一个 Title 表(Mr、Mrs 等)和一个 Student 表,它与 Title 具有多对一关系。
当我找到所有学生时,Hibernate 会针对学生列表发出一个查询,然后针对每个标题发出一个单独的查询。我期待它在一个带有连接的查询中完成所有这些。
我希望 spring 能够处理这个问题,而不必为这样一个简单的案例编写自己的查询。
这是我的设置:
@Entity(name = "title")
@Data
public class Title {
@Id
@GeneratedValue
@Column(name = "TITLE_ID", nullable = false)
private Long titleId;
@Column(name = "SHORT_NAME", nullable = false)
private String shortName;
}
@Entity(name = "student")
@Data
public class Student {
@Id
@GeneratedValue
@Column(name = "STUDENT_ID", nullable = false)
private Long studentId;
@ManyToOne
@JoinColumn(name = "TITLE_ID", nullable = false)
private Title title;
@Column(name = "NAME", nullable = false)
private String name;
}
public interface StudentRepository extends CrudRepository<Student, Long> {
}
@RestController
public class JoinController {
@Autowired
private StudentRepository repository;
@RequestMapping(value = "/student")
public String allStudents() {
Iterable<Student> students = repository.findAll();
return "students: " + students;
}
}
这是输出,显示所有 (4) 个查询:
org.hibernate.SQL :logStatement[109]
select
student0_.student_id as student_1_0_,
student0_.name as name2_0_,
student0_.title_id as title_id3_0_
from
student student0_
org.hibernate.SQL :logStatement[109]
select
title0_.title_id as title_id1_1_0_,
title0_.short_name as short_na2_1_0_
from
title title0_
where
title0_.title_id=?
o.h.t.d.sql.BasicBinder :bind[81] binding parameter [1] as [BIGINT] - [1]
org.hibernate.SQL :logStatement[109]
select
title0_.title_id as title_id1_1_0_,
title0_.short_name as short_na2_1_0_
from
title title0_
where
title0_.title_id=?
o.h.t.d.sql.BasicBinder :bind[81] binding parameter [1] as [BIGINT] - [2]
org.hibernate.SQL :logStatement[109]
select
title0_.title_id as title_id1_1_0_,
title0_.short_name as short_na2_1_0_
from
title title0_
where
title0_.title_id=?
o.h.t.d.sql.BasicBinder :bind[81] binding parameter [1] as [BIGINT] - [3]
另外,Postgres 的表设置:
CREATE TABLE TITLE (
TITLE_ID BIGSERIAL PRIMARY KEY,
SHORT_NAME TEXT NOT NULL
);
CREATE TABLE STUDENT (
STUDENT_ID BIGSERIAL PRIMARY KEY,
TITLE_ID BIGSERIAL,
NAME TEXT NOT NULL
);
ALTER TABLE STUDENT ADD FOREIGN KEY (TITLE_ID) REFERENCES TITLE;
INSERT INTO TITLE (TITLE_ID, SHORT_NAME) VALUES (1, 'Mr');
INSERT INTO TITLE (TITLE_ID, SHORT_NAME) VALUES (2, 'Mrs');
INSERT INTO TITLE (TITLE_ID, SHORT_NAME) VALUES (3, 'Dr');
INSERT INTO STUDENT (STUDENT_ID, TITLE_ID, NAME) VALUES (1, 1, 'Smith');
INSERT INTO STUDENT (STUDENT_ID, TITLE_ID, NAME) VALUES (2, 1, 'Anderson');
INSERT INTO STUDENT (STUDENT_ID, TITLE_ID, NAME) VALUES (3, 2, 'Jones');
INSERT INTO STUDENT (STUDENT_ID, TITLE_ID, NAME) VALUES (4, 3, 'Livingston');
【问题讨论】: