2012-06-12 8 views
6

To proste zapytaniezapytań Hibernate dając java.lang.IllegalArgumentException: węzeł przemierzać nie może być null

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

dając tym 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) 

jeśli robię

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

dont Wystąpił błąd, ale potrzebuję tylko recNo

Jakieś pomysły?

Odpowiedz

12

Zapomniałaś select:

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

Myślałem, że nie był potrzebny dla hsql –

+3

@ijabz klauzula select (oznacza to, że słowo select i pola, które chcesz wybrać) nie jest potrzebne. Ale musisz zacząć od "z", a otrzymasz byt. Jeśli chcesz wybrać określone pola, musisz wybrać opcję Wybierz. – Pablo

+2

Ah, ok dzięki. Tam, gdzie myślę, że hibernacja upada, jest to, że jeśli pojawia się problem, generowane komunikaty o błędach rzadko są bardzo pomocne. –

0

klauzuli SELECT zapewnia większą kontrolę nad wynikiem ustalonym niż z klauzuli. Jeśli chcesz uzyskać kilka właściwości obiektów zamiast całego obiektu, użyj klauzuli SELECT. Poniżej znajduje się prosta składnia z użyciem klauzuli SELECT, aby tylko nazwa pola obiektu Pracownik:

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

Jeśli chcesz cały obiekt ten czas „select * from” nie jest potrzebne.

2

Błąd ten również często zdarza się w przypadku korzystania z metody createQuery uruchomić nazwie zapytanie, zamiast getNamedQuery, na przykład:

session.createQuery("InvoiceItem.itemsFromInvoice") 

gdy właściwe podejście byłoby

session.getNamedQuery("InvoiceItem.itemsFromInvoice") 
Powiązane problemy