2011-02-02 21 views
14

có ai biết nếu và làm thế nào các giải pháp cho following question (được viết trong JPA API) có thể được viết bằng cách sử dụng API tiêu chuẩn ngủ đông?ElementCollection createAlias ​​trong hibernate API

Để cụ thể hơn tôi có một thực thể thảo luận có chứa một danh sách người tham gia (mà là một danh sách các username):

@ElementCollection 
@Column(name = "user_name") 
@CollectionTable(name = "DISCUSSION_USER", joinColumns = @JoinColumn(name = "DISCUSSION_ID")) 
@OrderColumn(name = "ORDER_INDEX") 
private List<String> participants = new ArrayList<String>(); 

Bây giờ tôi cần phải lấy tất cả các thảo luận nơi tên người dùng nhất định là một người tham gia.

Nếu tôi đã tạo ra một thực thể cho tham gia này sẽ là đơn giản:

Criteria crit = getSession().createCriteria(Discussion.class); 
    crit.createAlias("participants", "p"); 
    crit.add(Restrictions.eq("p.userName", portalUsername)); 

Nhưng tôi không thể tạo ra một bí danh với một tổ chức phi ...

Trả lời

2

Như đã giải thích here những gì tôi muốn là không thể:

Những hạn chế của việc sử dụng một ElementCollection thay vì một OneToMany là các đối tượng mục tiêu không thể được truy vấn, duy trì, hợp nhất độc lập với đối tượng cha mẹ của họ. Chúng là các đối tượng thuộc sở hữu riêng (phụ thuộc), giống như một ánh xạ được nhúng. Không có tùy chọn xếp tầng trên một ElementCollection, các đối tượng đích luôn được duy trì, hợp nhất, loại bỏ với cha mẹ của chúng.

Vì vậy, tôi đã sử dụng OneToMany để thay thế.

1

Bạn có thể cho chúng ta một nhiều hoàn thành lược đồ và truy vấn?

Ngoài ra, API tiêu chí còn hút. Hãy thử sử dụng QueryDSL, truy vấn của bạn có thể trông giống như:

HibernateQuery q=new HibernateQuery(getSession()) 
.from(QDiscussion.discussion).from(QDocument.document) 
.where(QDocument.document.userName.in(QDiscussion.discussion.userNames)) 
.list(QDocument.document); 
24

Trả lời muộn.

Các propertyName chính xác cho bộ sưu tập (chú thích bởi @ElementCollection) là "elements" hoặc liên tục CollectionPropertyNames#COLLECTION_ELEMENTS.

Hãy thử với các câu trả lời sau

Criteria crit = getSession().createCriteria(Discussion.class); 
crit.createAlias("participants", "p"); 

crit.add(Restrictions.eq("p.elements", portalUsername)); 

hoặc sử dụng liên tục COLLECTION_ELEMENTS thay

crit.add(Restrictions.eq("p." + CollectionPropertyNames.COLLECTION_ELEMENTS, portalUsername)); 
+1

bao giờ là quá muộn cho một câu trả lời tốt, tôi sẽ chắc chắn để thử này ra một lần –

+0

Xin lỗi đã không làm việc ... chết tiệt .... Nhưng tôi đang sử dụng một bản phát hành rất cũ, có thể là điều này được sửa trong các phiên bản mới hơn .. – Thihara

+0

Có vẻ như từ việc sử dụng các hằng số này trong mã nguồn Hibernate, đây là Chỉ truy vấn HQL. –

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