java - 从 SQL 表中选择并联接(Select 语句 + Hibernate 代码)

标签 java mysql sql hibernate join

我有以下两个表:

“学生”和“技能”表

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/

相关文章:

java - Spring 中@PostMapping 和@PutMapping 之间的真正区别是什么?

mysql - 2 相同类型的对象映射到MySQL DB问题

mysql - 在 Windows 上使用 Sonar 和 MySQL 5.6 架构设置失败

mysql - 如何减去从表中选择的两个值

java - eclipse行号状态行贡献项是如何实现的?

java - 使用 "My files"应用程序单击按钮打开文件夹

php - Mysql在每次刷新页面时创建新的线程连接

mysql - 根据 id 的数组查询 id

sql - 两个内部连接 ​​MYSQL

java.lang.IllegalAccessError : tried to access method org. org.apache.poi.openxml4j.opc.ZipPackage 类中的 apache.poi.util.POILogger.log