2010-10-27 23 views
8

Tôi có 2 lớp có nhiều mối quan hệ. Tôi lấy 'Câu hỏi' và 'Thẻ' làm ví dụ để làm cho trường hợp dễ hiểu hơn.Hibernate nhiều-nhiều: Tiêu chí để tìm kiếm tất cả các lớp A có chứa lớp B

Đối với mỗi câu hỏi, bạn có một số thẻ. Giống như đối với thẻ.

Điều tôi muốn làm là nhận tất cả các câu hỏi (và các thẻ tương ứng của chúng) nếu câu hỏi chứa thẻ nói "hibernate".

Tôi có thể làm nhiều nhất bằng SQLQuery trong bảng nhiều người và trả về danh sách ID câu hỏi. Sau đó sử dụng một tiêu chí với một limits.in và lấy tất cả các câu hỏi. Nhưng nó quá vụng về và tôi cá là có cách làm tốt hơn, đúng không?

Trả lời

23

Về cơ bản, bạn cần phải tạo một bí danh và sử dụng bí danh để truy vấn bộ sưu tập con như vậy:

List questions = sess.createCriteria(Question.class) 
    .createAlias("Tags", "t") 
    .add(Restrictions.eq("t.name", "hibernate")) 
    .list(); 

tôi giả sử bạn không thực sự có một lớp đại diện cho "cầu nối" bảng vào bảng thẻ trong tình huống này, nếu không bạn sẽ cần phải tạo ra 2 bí danh ví dụ:

List questions = sess.createCriteria(Question.class) 
     .createAlias("QuestionTag", "qt")    
     .createAlias("qt.Tags", "t") 
     .add(Restrictions.eq("t.name", "hibernate")) 
     .list(); 

bạn có thể tìm hiểu thêm từ các tài liệu:

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querycriteria.html#querycriteria-associations

+0

Tôi nên hỏi sớm hơn nhiều! Không thể tin rằng nó thẳng tiến về phía trước. –

+0

Cảm ơn @ lomaxx, tôi có cùng một câu hỏi nhưng với một yêu cầu khác nhỏ: Nếu tôi muốn so sánh "qt" với đối tượng Thẻ thì sao? (không phải qt.name với tag.getName()) – smallufo

+0

@smallufo: ý của bạn là gì? bạn đang nói bạn có một thẻ và bạn muốn so sánh bộ sưu tập qt.Tags với thẻ đó? Trong trường hợp đó, bạn cần phải thực hiện Restrictions.eq ("qt.Tags.Id", tag.Id) – lomaxx

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