2016-03-14 27 views
8

Tôi có một lớp thực thể như sau:Làm thế nào tôi nên tham khảo các enums bên trong (được định nghĩa trong một thực thể) từ một truy vấn JPQL sử dụng Hibernate?

package stuff; 

@Entity 
class Thing { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Basic 
    @Enumerated 
    private State state; 

    public enum State { 
     AWESOME, 
     LAME 
    } 
} 

Làm thế nào tôi có thể chọn tất cả điều với nhà nước TUYỆT sử dụng JPQL và Hibernate?

select t from Thing t where t.state=stuff.Thing.State.AWESOME 

... cung cấp cho các lỗi ...

org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'stuff.Thing.State.AWESOME' 

Trả lời

10

Sử dụng các thành ngữ sau:

select t from Thing t where t.state=stuff.Thing$State.AWESOME 

Type$InnerType là quy ước đặt tên của Java với nhiều loại bên trong.

Khi bạn cố gắng sử dụng ký hiệu chấm, Hibernate giả định rằng bạn đang cố gắng truy cập thuộc tính lồng nhau, trong đó trường hợp này (đúng) không thành công.

+2

tốt hơn vẫn sử dụng một tham số, và vượt qua một giá trị enum trong khi giá trị tham số ... và truy vấn là tái sử dụng cho tham số khác đánh giá cao –

+0

@NeilStockton: Một số truy vấn phức tạp hơn chỉ có thể có ý nghĩa trong bối cảnh một trạng thái cụ thể. Bạn nói đúng rằng trong các trường hợp đơn giản như ví dụ, việc sử dụng tham số có thể linh hoạt hơn. Câu hỏi được giới hạn ở cú pháp;) –

0
select t from Thing t where t.state='AWESOME' 
+0

Công trình này, nhưng phá vỡ việc kiểm tra và tái cấu trúc kiểu cho các IDE nhận biết JPA như IntelliJ. Tốt hơn là sử dụng kiểu thay vì biểu diễn chuỗi, tôi nghĩ vậy. –

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