这个简单的查询
session = com.jthink.songlayer.hibernate.HibernateUtil.getSession();
Query q = session.createQuery("recNo from SongChanges");
给出这个堆栈跟踪
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)
如果我这样做
session = com.jthink.songlayer.hibernate.HibernateUtil.getSession();
Query q = session.createQuery("from SongChanges");
我没有收到错误,但我只需要recNo
有什么想法吗?
答案 0 :(得分:12)
你忘记了选择:
Query q = session.createQuery("select sc.recNo from SongChanges sc");
答案 1 :(得分:2)
当您使用方法createQuery
运行命名查询而不是getNamedQuery
时,通常会发生此错误,例如:
session.createQuery("InvoiceItem.itemsFromInvoice")
正确的方法是
session.getNamedQuery("InvoiceItem.itemsFromInvoice")
答案 2 :(得分:0)
SELECT子句比from子句提供对结果集的更多控制。如果要获取对象的少数属性而不是完整对象,请使用SELECT子句。以下是使用SELECT子句获取Employee对象的名称字段的简单语法:
String hql = "SELECT E.name FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
如果你想要整个对象的时间&#34;选择*来自&#34;不需要。