2012-01-04 35 views
51

Tôi đang tìm kiếm một tiêu chí ngủ đông để sau:Tiêu chuẩn Hibernate Tham gia với 3 Bàn

Dokument.class được ánh xạ tới Vai trò Id vai trò

Role.class có ContactPerson ContactId

Contact.class FirstName LastName

Tôi muốn tìm kiếm đầu tiên hoặc La stName trên lớp Contact và truy xuất danh sách các Dokuments được kết nối.

Tôi đã thử một cái gì đó như thế này:

session.createCriteria(Dokument.class) 
.setFetchMode("role",FetchMode.JOIN) 
.setFetchMode("contact",FetchMode.JOIN) 
.add(Restrictions.eq("LastName","Test")).list(); 

tôi nhận được một lỗi không thể giải quyết bất động sản "LastName" cho các lớp học "Dokument"

Ai đó có thể giải thích tại sao các tìm kiếm tham gia vào Dokument và không phải trên tất cả các bảng đã tham gia? Cảm ơn trước cho tất cả sự giúp đỡ!

Trả lời

103

Chế độ tìm nạp chỉ cho biết rằng liên kết phải được tìm nạp. Nếu bạn muốn thêm các hạn chế đối với một thực thể liên quan, bạn phải tạo một bí danh hoặc một tiêu chí phụ. Tôi thường thích sử dụng bí danh, nhưng YMMV:

Criteria c = session.createCriteria(Dokument.class, "dokument"); 
c.createAlias("dokument.role", "role"); // inner join by default 
c.createAlias("role.contact", "contact"); 
c.add(Restrictions.eq("contact.lastName", "Test")); 
return c.list(); 

này tất nhiên cũng được giải thích trong Hibernate reference manualjavadoc for Criteria thậm chí còn có các ví dụ. Đọc tài liệu: nó có rất nhiều thông tin hữu ích.

+3

JB cảm ơn rất nhiều. Vâng tôi đã đọc các thông số kỹ thuật, nhưng đối với một newbee Hibernate nó là khá khó khăn để quấn đầu của một người xung quanh tất cả các Lingo Hibernate. Một lần nữa THANKS IT HOẠT ĐỘNG :-) – mahatmanich

+0

btw một hiệp hội là gì, chỉ cần một số tài liệu tham khảo? – mahatmanich

+0

Một liên kết là khi một thực thể được liên kết với một thực thể khác có liên kết OneToOne, OneToMany, ManyToOne hoặc ManyToMany .... –

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