2010-01-14 33 views
20

Tôi là người mới đến Hibernate.Hibernate và kết thúc bất ngờ của ngoại lệ Subtree

Tôi có một Item POJO chứa Set<String> bao gồm các nhãn. Các nhãn được chứa trên một bảng cơ sở dữ liệu khác từ bảng Item, vì vậy tôi tham gia để điền vào các pojo.

Tôi đang cố gắng chạy truy vấn ví dụ đơn giản từ sách "Java Persistance with Hibernate" nơi tôi truy vấn from Item item where 'hello' member of item.labels. Chỉ vì một lý do nào đó tôi nhận được một số

`org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree[from /*qualified class path*/.Item item where 'hello' member of item.labels]` 

Điều gì có thể gây ra vấn đề này?

Dưới đây là các POJO tôi:

public class Item 
     private int uuid; 
     private Set<String>labels = new HashSet<String>(); 

     @Id 
     public int getUuid(){ 
      return uuid; 
     } 

     @CollectionOfElements 
     @JoinTable(name="labels", [email protected](name="uuid")) 
     @Column(name="label") 
     public Set<String> getLabels(){ 
      return labels; 
     } 
} 

Trả lời

7

Đối với nguyên thủy bộ sưu tập bạn nên sử dụng truy vấn HQL như sau:

from Item item join item.labels lbls where 'hello' in (lbls) 

PS: 'tham gia' là bắt buộc vì 'nhãn' là OneToMany hoặc ManyToMany biến thể, dấu ngoặc đơn là bắt buộc vì 'lbls' là một bộ sưu tập

47

Từ googling xung quanh, dường như bộ sưu tập tham số của bạn có thể có sản phẩm nào. Tôi muốn thêm một kiểm tra trống trước khi gọi truy vấn.

Bài học là Google là bạn của bạn. Khi bạn không thể tìm ra thông báo lỗi, hãy thử nhập vào Google (hoặc công cụ yêu thích của bạn). Bạn không chắc là người đầu tiên bị nhầm lẫn với nó.

+1

, truy vấn "từ Mục mặt hàng" trả về chính xác, với các bộ sưu tập không trống. Ngoài ra, truy vấn "từ mục Item có kích thước (item.labels)> 0" trả về chính xác, vì vậy tôi không nghĩ đó là vấn đề kích thước –

+1

Cảm ơn - đây chính là vấn đề tôi gặp phải. Thật là một thông báo lỗi ngu ngốc! –

+0

... và nếu bộ sưu tập chỉ có một phần tử, bạn nhận được thông báo tường trình như 'ERROR [chính] o.h.h.PARSER // - : 0: 0: kết thúc không mong đợi của subtree'. Tôi yêu sự giúp đỡ của chẩn đoán này. – alf

1

Thành viên của lệnh trong HQL được dành riêng cho việc sử dụng các đối tượng không nguyên thủy. Có hai điều bạn có thể làm. Bạn có thể tạo ra một SQLQuery như sau:

SQLQuery sQuery = session.createSQLQuery("select * 
              from item_table it 
              inner join label_table lt 
              where it.id = lt.item_id 
              and lt.label = 'hello'"); 
sQuery.list(); 

Hoặc bạn có thể tạo ra một lớp gọi là Label và làm như sau trong HQL của bạn:

from Item item, Label label 
where label member of item.labels 
     and label.label = 'hello' 

Hope this helps :)

+0

aww man, tôi đã hy vọng nó sẽ không đến với SQL;) Cảm ơn mặc dù, giải pháp của bạn làm việc tuyệt vời! –

+0

Không có prob, Scott. :) – jtbradle

1

Dựa trên các nhận xét về lỗi HHH-5209, đó là về cùng một ngoại lệ được ném từ một truy vấn JPQL tương tự, tôi tin rằng biểu mẫu chính xác ở đây là:

select item from Item item where 'hello' in elements(item.labels) 

Chức năng elements có khóa. Điều này có lẽ hơi đơn giản hơn lời đề nghị của Yuri, bởi vì nó tránh sự tham gia rõ ràng. Tuy nhiên,

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