2012-06-12 14 views
6

này truy vấn đơn giảnHibernate truy vấn cho java.lang.IllegalArgumentException: nút để đi qua không thể được null

session = com.jthink.songlayer.hibernate.HibernateUtil.getSession(); 
Query q = session.createQuery("recNo from SongChanges"); 

cho stacktrace

java.lang.IllegalArgumentException: node to traverse cannot be null! 
    at org.hibernate.hql.internal.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:63) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:272) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:119) 
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:214) 
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:192) 
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1537) 

này nếu tôi làm

session = com.jthink.songlayer.hibernate.HibernateUtil.getSession(); 
Query q = session.createQuery("from SongChanges"); 

Tôi không gặp lỗi, nhưng tôi chỉ cần recNo

Bất kỳ ý tưởng nào?

Trả lời

12

Bạn quên chọn:

Query q = session.createQuery("select sc.recNo from SongChanges sc"); 
+0

tôi nghĩ rằng không cần thiết cho hsql –

+3

@ijabz mệnh đề select (có nghĩa là chọn từ và các trường mà bạn muốn chọn) là không cần thiết. Nhưng sau đó bạn phải bắt đầu với "từ" và bạn có được thực thể. Nếu bạn muốn chọn các trường cụ thể, thì bạn phải chọn. – Pablo

+2

Ah, cảm ơn nhé. Tôi nghĩ rằng hibernate rơi xuống là nếu có một vấn đề các thông báo lỗi nó tạo ra hiếm khi rất hữu ích. –

0

Mệnh đề SELECT cung cấp kiểm soát nhiều hơn tập hợp kết quả hơn từ khoản. Nếu bạn muốn có được vài thuộc tính của đối tượng thay vì đối tượng hoàn chỉnh, hãy sử dụng mệnh đề SELECT. Sau đây là cú pháp đơn giản của việc sử dụng mệnh đề SELECT để có được chỉ là tên lĩnh vực của đối tượng nhân viên:

String hql = "SELECT E.name FROM Employee E"; 
Query query = session.createQuery(hql); 
List results = query.list(); 

Nếu bạn muốn toàn bộ đối tượng thời điểm đó "select * from" là không cần thiết.

2

Lỗi này cũng thường xảy ra khi bạn sử dụng phương pháp createQuery để chạy một truy vấn tên, thay vì getNamedQuery, ví dụ:

session.createQuery("InvoiceItem.itemsFromInvoice") 

khi cách tiếp cận đúng sẽ là

session.getNamedQuery("InvoiceItem.itemsFromInvoice") 
Các vấn đề liên quan