2012-03-14 31 views
6

Tôi đang cố gắng thực hiện một câu lệnh chọn số đơn giản từ một phương thức hoạt động trên phần khác của chương trình nhưng ở đây nó cho tôi lỗi.java hibernate không thể giải quyết thuộc tính

public Long validateSub(String source, String tbl){ 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 


    Query q = session.createQuery("SELECT count(s) from SlaveSubscribers s where s.SOURCENAME = :sourcename AND s.TBL = :tbl"); 
    q.setParameter("sourcename", source); 
    q.setParameter("tbl", tbl); 

    Long result = (Long) q.list().get(0); 
    session.getTransaction().commit(); 

    return result; 

} 

Các Thông báo lỗi:

Exception in thread "Thread-3" org.hibernate.QueryException: could not resolve property: SOURCENAME of: com.datadistributor.main.SlaveSubscribers [SELECT count(s) from com.datadistributor.main.SlaveSubscribers s where s.SOURCENAME = :sourcename AND s.TBL = :tbl] 

Tôi không có ý tưởng tại sao điều này không làm việc

+0

Vui lòng đăng trích xuất SlaveSubscribers của bạn (khai báo thành viên và getter/setter cho sourcename) và tệp ánh xạ ngủ đông cho lớp này (nếu có). Lỗi phải ở đó. – Johanna

Trả lời

5

Bạn không có thuộc tính dai dẳng (field) SOURCENAME trong SlaveSubscribers thực thể. Rất có thể SOURCENAME là tên của cột cơ sở dữ liệu. Trong HQL bạn cần sử dụng tên của trường (trường hợp nhạy cảm).

6

Chỉ cần làm rõ câu trả lời ở trên, vì tôi ghét mọi người bỏ lỡ nó.

Hibernate sử dụng thuộc tính biến trong lớp cho truy vấn, không phải tên cột trong cơ sở dữ liệu.

Kết quả là nếu bạn có một lớp mô hình như thế này:

private Long studentId; 

@Id 
@GeneratedValue 
@Column(name="studentid") 
public Long getStudentId() 
{ 
    return studentId; 
} 

Bạn sẽ phải làm một truy vấn trên StudentID không StudentID.

+0

Lưu ý tuyệt vời, điều này đã giúp tôi rất nhiều. Tôi muốn thêm rằng trường hợp của biến vì nó được định nghĩa trong lớp không quan trọng. Ví dụ, bạn có thể cũng đã định nghĩa biến 'Long' trong lớp là' studentid' thay vì 'studentId', và miễn là getter có' I' được viết hoa, bạn vẫn cần viết hoa 'I' trong truy vấn của bạn, là tốt. –

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