2010-08-19 43 views
7

Truy vấn mong muốn của tôi là nhận danh sách các đối tượng Khóa học thuộc về Danh mục. Đối tượng của tôi như sau:Truy vấn đệ quy Hibernate

public class Course{ 
    String name; 
    List<Category> categories; 
} 

public class Category{ 
    String name; 
    Category parent; 
} 

Kể từ khi hạng mục tham khảo lẫn nhau, họ có thể có một chiều sâu vô hạn:

A 
    A.A 
    A.A.A 
    A.A.B 
    A.B 
    A.B.A 
B 
B.A 
B.B 
C 

Làm thế nào tôi có thể truy vấn cho các khóa học trong thể loại "AA", và trả lại tất cả Các khóa học liên quan đến AA, AAA và AAB?

Trả lời

3

Bởi vì bạn không biết sâu bao nhiêu cây, bạn có thể sử dụng một số loại hoa văn như sau

select distinct 
    c 
from 
    Course c 
left join fetch 
    c.categories c 
where 
    c.name like 'A.A%' 
4

Nếu bạn sẵn sàng để sử dụng SQL bản địa và cơ sở dữ liệu của bạn hỗ trợ biểu thức bảng chung đệ quy (về cơ bản tất cả các DBMS lớn trừ MySQL) nó khá dễ dàng:

 
WITH RECURSIVE course_tree (name) AS (
    SELECT name 
    FROM course 
    WHERE name = 'A.A' 
    UNION ALL 
    SELECT name 
    FROM course 
    WHERE parent_id = course_tree.id 
) 
SELECT * 
FROM course_tree 
+0

Chỉ trong trường hợp ai đó quan tâm đến [Bảng Common Expressions là một phần của SQL: tiêu chuẩn 1999] (http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL# Common_ta ble_expression), mặc dù, như đã đề cập trong câu trả lời, MySQL không hỗ trợ chúng và cũng không làm Hibernate/JPA ngoài các truy vấn SQL nguyên gốc. –

+0

Xin chào. Tôi đang xây dựng một POC như một bài kiểm tra phỏng vấn và tôi đang cố gắng sử dụng truy vấn đệ quy giống như ví dụ này. Cơ sở dữ liệu là một cơ sở dữ liệu H2 (vì đây chỉ là một POC). H2 không hỗ trợ truy vấn đệ quy và tôi đã thử nghiệm nó bằng bảng điều khiển H2. Nhưng khi tạo một truy vấn gốc, nó trả về NO records. Dự án là Spring Boot + Spring Data, ví dụ H2 thử nghiệm có trong bộ nhớ. Bất kỳ đầu vào được nhiều đánh giá cao. Cảm ơn. –

Các vấn đề liên quan