введение
Думаю, что все сталкивались с проблемой горизонтального и вертикального преобразования в SQL. Например, есть студенческий график и профессиональный график.
| Имя | возраст |
|---|---|
| студент 1 | 19 |
| студент 2 | 20 |
| название курса | Студенты по выбору | Учитель |
|---|---|---|
| язык | студент 1 | учитель языка |
| математика | студент 1 | учитель математики |
| язык | студент 2 | учитель языка |
| Химическая | студент 2 | Учитель химии |
Если вам нужно узнать, какие курсы посещал каждый студент, само собой разумеющимся является объединение двух таблиц, и результат выбора выглядит следующим образом. Такой результат нам не нужен, потому что имя студента избыточно.
Обычный выбор комбинированных результатов
姓名 课程名 任课教师
学生1 语文 语文教师
学生1 数学 数学教师
学生2 语文 语文教师
学生2 化学 化学教师
Но обычно мы хотим что-то вроде следующего. То есть сгруппируйте по информации о выборе курса студента 1, чтобы выполнить горизонтальное и вертикальное преобразование. И мы можем вернуть результат классу сущностей java, поэтому лучше быть в форме Json. Таким образом, мы можем инкапсулировать информацию о курсе в класс сущностей через Json.
ожидать результатов
姓名 课程信息
学生1 [{课程名:语文,课程教师:语文教师},{课程名:数学,课程教师:数学教师}]
学生2 [{课程名:语文,课程教师:语文教师},{课程名:化学,课程教师:化学教师}]
Этот класс сущностей может быть следующим, а класс сущностей Result содержит класс Course.Если это вышеупомянутый «результат комбинации обычного выбора», то мы должны объединить его в java, что очень хлопотно. Чтобы получить вышеуказанный «ожидаемый результат», вам нужно использовать функцию json.
Result.java
// 学生姓名
private String studentName;
// 选课信息
private Course course;
Course.java
// 课程名
private String courseName;
// 课程教师
private String courseTeacher;
Используйте json_agg и json_build_object
Сначала посмотрите на вывод. SQL выглядит следующим образом. Результат - ожидаемый результат выше.
select
t1.学生姓名
, json_agg(
json_build_object('courseName',t2.courseName,'courseTeacher',t2.courseTeacher)
)
from
学生表 t1
left join
专业课表 t2
on t1.学生姓名 = t2.学生姓名
group by
t1.学生姓名
что такое json_agg
json_agg— это функция агрегации, обычно используемая в сочетании с group by, для агрегирования значений в массив JSON.
| Имя функции | параметр | возвращаемое значение |
|---|---|---|
| json_agg(expression) | any | json |
json_agg поддерживает сортировку, например, приведенный выше sql может быть отсортирован по названию курса в порядке t2.courseName
select
t1.学生姓名
, json_agg(
json_build_object('courseName',t2.courseName,'courseTeacher',t2.courseTeacher)
order by t2.courseName --支持排序
)
from
学生表 t1
left join
专业课表 t2
on t1.学生姓名 = t2.学生姓名
group by
t1.学生姓名
что такое json_object_agg
json_object_agg— это функция, которая объединяет пары имя/значение в объект JSON.
| Имя функции | параметр | возвращаемое значение |
|---|---|---|
| json_object_agg(name, value) | (any, any) | json |
В заключение
Если горизонтальное и вертикальное преобразование не реализовано, может потребоваться вручную собрать результаты SQL в java для операций агрегации или дважды выполнить SQL. Используйте функции json_agg и json_build_object, чтобы инкапсулировать результат в json и поместить его непосредственно в класс сущности.