Concat các record thành 1 chuỗi trong HQL Hibernate

Chào mọi người
Mình mới tìm hiểu hibernate và spring và có 1 vấn đề muốn nhờ mọi người giúp.

Mình có 3 table MEMBER_INFO, SUBJECT_INFO, MEMBER_SUBJECT trong database như bên dưới:

MEMBER_INFO:

MEMBER_ID   |   MEMBER_NAME
MB01        |   nguyen van A

SUBJECT_INFO:

SUBJECT_ID   |   SUBJECT_NAME
S1           |   JAVA
S2           |   C++
S3           |   .NET

MEMBER_SUBJECT:

ID   |   SUBJECT_ID   |   MEMBER_ID
1    |   S1           |   MB01
1    |   S2           |   MB01

Cho mình hỏi câu truy vấn HQL như thế nào để có được dự liệu mong muốn như bên dưới:

Expected Result:

  MEMBER_ID   |   MEMBER_NAME   |   SUBJECT
  MB01        |   nguyen van A  |   JAVA,C++

Cho mình hỏi có cách gì get Expected Result trên vào 1 class object được không?
Mong mọi người giúp đỡ, cảm ơn.

Đơn giản nhất là bạn có thể dùng nhiều câu HQL để lấy kết quả và dùng 1 custom class để chứa dữ liệu mong muốn

4 Likes

Nếu đã thiết lập @ManyToMany giữa Member và Subject thì đâu cần HQL gì đâu. Viết code đơn giản thôi, nó tựa như thế này.

Member member = session.load(Member.class, "MB01"); // 1
List<Subject> subjects = member.getSubjects();      // 2

Lệnh 1 sinh ra SELECT từ bảng member_info, với primary key "MB01".
Lệnh 2 sinh ra SELECTJOIN giữa 3 bảng member_info, subject_info, member_subject, sau đó Hibernate tự chuyển thông tin của subject_info thành ArrayList<Subject>.

4 Likes

Bạn thử truy vấn theo câu SQL này:

SELECT mi.MEMBER_ID, mi.MEMBER_NAME, si.SUBJECT_NAME
FROM MEMBER_INFO mi
INNER JOIN MEMBER_SUBJECT ms ON ms.MEMBER_ID = mi.MEMBER_ID
INNER JOIN SUBJECT_INFO si ON si.SUBJECT_ID = ms.SUBJECT_ID
WHERE mi.MEMBER_ID = #{memberId};

sau đó tạo 1 custom entity chứa memberId, memberName, subjectName để chứa result,
lưu ý là đổi tên bảng với các field cho giống với tên trong entity nhé

1 Like

@hungaya @xabuilenanez
Cảm ơn 2 bạn đã quan tâm.

Mình xin lỗi vì chưa nêu rõ câu hỏi, mình muốn dùng câu HQL vì mình muốn lấy ra list của Member chứ không phải chỉ 1 Member.

Cho mình hỏi lại là có cách nào có thể get được List< Member > members mà trong mỗi Member có 1 List<Subject> được không?

Mong nhận phản hồi sơm, mình cảm ơn

Chắc là N+1 problem. Vậy dùng HQL tựa thế này:

FROM member JOIN FETCH member.subjects
4 Likes

Tại mới chuyển qua mò Hibernate với spring boot nên hơi hoang mang nên bạn thông cảm. Để mình thử. Nếu có problem N+2 mong bạn vẫn giúp đỡ :sweat_smile: :sweat_smile: :sweat_smile:

2 Likes

N+1 nghĩa là 1 query phát sinh ra N query (!!)
Mà mỗi query lại có overhead nên cực kì lâu. Cái này kiểu làm việc dễ lại dễ hơn, nhưng khó trở thành không tưởng.

5 Likes

À mình mới tìm hiểu lại các mối quan hệ trong database.
Ban đầu cứ nghĩ bạn ấy cà khịa mình. Mình cảm ơn :rofl:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?