2011-07-19 39 views
12

xem xét sau hai mối quan hệ:Hibernate: Tiêu chí với bảng kết nối nhiều người?

@Entity class Foo { 
    @Id id; 

    @ManyToMany 
    @JoinTable(name = "ATag", 
     joinColumns = @JoinColumn(name = "foo_id"), 
     inverseJoinColumns = @JoinColumn(name = "tag_id")) 
    Set<Tag> tags; 
} 

@Entity class Tag { 
    @Id Long id; 
    String name; 
} 

Không có lớp thực thể tương ứng cho bảng tham gia ATAG. Bây giờ, tôi muốn có được tất cả các phiên bản Foo với Thẻ có tên 'tag1', có thể sử dụng Chỉ tiêu chí không?

Truy vấn phụ có thể hữu ích, tuy nhiên, tôi không thể tạo DetachedCriteria cho lớp ATag.class không tồn tại.

Trả lời

24

Chỉ cần xử lý vấn đề chính xác này. Bạn đang suy nghĩ trong các bảng, không phải đối tượng. Chỉ cần tham khảo tags.name và để Hibernate chăm sóc phần còn lại:

Criteria crit = session.createCriteria(Foo.class); 
crit.createAlias("tags", "tagsAlias"); 
crit.add(Restrictions.eq("tagsAlias.name", someValue); 

Nếu bạn xem SQL Hibernate spits ra, bạn sẽ thấy nó sử dụng các bảng tham gia.

+1

Điều quan trọng cần lưu ý là sử dụng thuộc tính của đối tượng chứ không phải đối tượng. Hibernate sử dụng Restrictions không chỉ sử dụng khóa chính được định nghĩa POJO. Ở đây ví dụ sử dụng tên thuộc tính của các thẻ đối tượng. Tôi đã mất thời gian cố gắng đặt toàn bộ đối tượng thay vì nói rõ ràng thuộc tính nào cần được kiểm tra theo biến vị ngữ tiêu chí. –

+3

Tại sao cần sử dụng bí danh? Bạn không thể đơn giản sử dụng 'tags.name' thay vì' tagsAlias.name'? – sp00m

+0

Tạo bí danh khiến cho việc tham gia bên trong diễn ra tự động. – derrik

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