6

这个简单的查询

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

有任何想法吗 ?

4

3 回答 3

12

您忘记了选择:

Query q = session.createQuery("select sc.recNo from SongChanges sc");
于 2012-06-12T12:02:13.970 回答
2

当您使用该方法createQuery运行命名查询而不是 时,通常也会发生此错误getNamedQuery,例如:

session.createQuery("InvoiceItem.itemsFromInvoice")

当正确的方法是

session.getNamedQuery("InvoiceItem.itemsFromInvoice")
于 2015-06-18T13:46:25.810 回答
0

SELECT 子句比 from 子句提供了对结果集的更多控制。如果要获取对象的少数属性而不是完整的对象,请使用 SELECT 子句。以下是使用 SELECT 子句获取 Employee 对象的 name 字段的简单语法:

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

如果您想要整个对象,则不需要“select * from”。

于 2012-06-12T12:20:52.683 回答