我有以下两个表:
“学生”和“技能”表
STUDENT table
"id" "name"
1 Peter
2 David
3 Mark
SKILL table
"id" "id_student" "skill" "skill value"
1 1 height 180
2 1 weight 75
3 2 height 170
4 3 height 180
我想选择“每个高度为 180、体重为 75、名字为“Peter”的学生”。
我需要的主要内容是 SQL 语句,但如果有人能告诉我如何使用 Java + Hibernate 来执行此操作(我的意思是如何创建 Criteria 对象),那也会非常有帮助
非常感谢您的帮助。
最佳答案
在不放弃整个游戏的情况下,这有帮助吗?
DROP TABLE IF EXISTS student;
CREATE TABLE student
(id INT NOT NULL aUTO_INCREMENT PRIMARY KEY
,name VARCHAR(12) NOT NULL
);
INSERT INTO student VALUES
(1,'Peter'),
(2,'David'),
(3,'Mark'),
(4,'Peter'),
(5,'Brian');
DROP TABLE IF EXISTS student_skill;
CREATE TABLE student_skill
(id_student INT NOT NULL
,skill VARCHAR(20) NOT NULL
,value INT NOT NULL
,PRIMARY KEY(id_student,skill)
);
INSERT INTO student_skill VALUES
(1,'height',180),
(1,'weight',75),
(2,'height',170),
(3,'height',180),
(4,'height',170),
(4,'weight',75),
(5,'height',180),
(5,'weight',75);
查询 1。
SELECT x.*
, y.height
, y.weight
FROM student x
JOIN
( SELECT id_student
, MAX(CASE WHEN skill = 'height' THEN value END) height
, MAX(CASE WHEN skill = 'weight' THEN value END) weight
FROM student_skill
GROUP
BY id_student
) y
ON y.id_student = x.id;
+----+-------+--------+--------+
| id | name | height | weight |
+----+-------+--------+--------+
| 1 | Peter | 180 | 75 |
| 2 | David | 170 | NULL |
| 3 | Mark | 180 | NULL |
| 4 | Peter | 170 | 75 |
| 5 | Brian | 180 | 75 |
+----+-------+--------+--------+
...或者查询 2。
SELECT s.*
, h.value height
, w.value weight
FROM student s
LEFT
JOIN student_skill h
ON h.id_student = s.id
AND h.skill = 'height'
LEFT
JOIN student_skill w
ON w.id_student = s.id
AND w.skill = 'weight';
+----+-------+--------+--------+
| id | name | height | weight |
+----+-------+--------+--------+
| 1 | Peter | 180 | 75 |
| 2 | David | 170 | NULL |
| 3 | Mark | 180 | NULL |
| 4 | Peter | 170 | 75 |
| 5 | Brian | 180 | 75 |
+----+-------+--------+--------+
关于java - 从 SQL 表中选择并联接(Select 语句 + Hibernate 代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47334579/