Hibernate request providing java.lang.IllegalArgumentException: node to move cannot be null

This simple request

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

providing this stack

 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) 

if i do

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

I don't get the error, but I only need recNo

Any ideas?

+6
source share
3 answers

You forgot to choose:

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

This error also usually occurs when you use the createQuery method to run a named query instead of getNamedQuery , for example:

 session.createQuery("InvoiceItem.itemsFromInvoice") 

when the right approach will be

 session.getNamedQuery("InvoiceItem.itemsFromInvoice") 
+2
source

The SELECT clause provides more control over the result set than the from clause. If you want to get multiple properties of objects instead of a complete object, use the SELECT clause. The following is a simple syntax for using a SELECT clause to retrieve only the Employee object name field:

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

If you need the whole object, then the time "select * from" is not required.

0
source

Source: https://habr.com/ru/post/917879/


All Articles