使用hibernate时遇到一个问题
Query query=session.createQuery("select id,name,district from Street");
List strList=query.list();
其中Street是一个街道实体类,district是区的实体类,两者存在多对一关联。
使用上面的语句进行查询没有问题。对应的sql语句为
Hibernate: select street0_.id as col_0_0_, street0_.name as col_1_0_, street0_.district_id as col_2_0_, district1_.id as id1_, district1_.name as name1_ from street street0_ inner join district district1_ on street0_.district_id=district1_.id
Hibernate: select streets0_.district_id as district3_1_, streets0_.id as id1_, streets0_.id as id2_0_, streets0_.name as name2_0_, streets0_.district_id as district3_2_0_ from street streets0_ where streets0_.district_id=?
Hibernate: select streets0_.district_id as district3_1_, streets0_.id as id1_, streets0_.id as id2_0_, streets0_.name as name2_0_, streets0_.district_id as district3_2_0_ from street streets0_ where streets0_.district_id=?
将相应的hql进行修改
Query query=session.createQuery("select id,district,name from Street");
List strList=query.list();
改变的是属性的先后顺序,结果报错
Exception in thread "main" java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode
\-[IDENT] IdentNode: 'name'
at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:167)
at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:831)
at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:619)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:672)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
at cn.jbit.houserent.bean.TestHibernate.main(TestHibernate.java:24)
不知道什么原因,不过通过实验结果得知hibernate进行属性查询时,写的hql中,关联对象属性应放到最后位置。
Query query=session.createQuery("select s.id,s.district,s.name from Street s");
List strList=query.list();
为实体类添加一个别名后,能够正常运行。