如何在HQL中编写“不存在”查询?我正在尝试获取一个HQL不存在查询,该查询返回与此Oracle SQL查询相同的结果:
select * from SCHOOL a where not exists (select 1 from STUDENT b where B.SCHOOL_ID=a.id and B.STATUS_ID not in (0,1,2,3,4))
我的映射文件如下:
<!-- primary key ommitted --> <set name="students" cascade="all" fetch="select" lazy="false" > <key column="SCHOOL_ID" /> <one-to-many class="com.companyname.Student" /> </set> </class> <!-- primary key ommitted --> <many-to-one name="school" column="SCHOOL_ID" class="com.companyname.School" fetch="join" lazy="false"/> <many-to-one name="status" class="com.companyname.Status" column="STATUS_ID" /> </class>
我在School.hbm.xml文件中尝试了以下标签
<query name="myQuery"> <![CDATA[ from School s where not exists from Student st where st.school_id=s.id and st.status.id not in (0,1,2,3,4) ]]> </query>
我得到了这个堆栈跟踪
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException Caused by: java.lang.NullPointerException at org.hibernate.hql.ast.HqlParser.negateNode(HqlParser.java:117) at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2378) at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2331) at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2296) at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2082) at org.hibernate.hql.antlr.HqlBaseParser.logicalExpression(HqlBaseParser.java:1858) at org.hibernate.hql.antlr.HqlBaseParser.whereClause(HqlBaseParser.java:454) at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:708) at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296) at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159) at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:248) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157) at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111) at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77) at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56) at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72) at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:402) at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:352)
有人可以让我知道我在做什么错吗?
谢谢!
您的命名查询无效(school_id不是Student实体的属性),这会阻止SessionFactory实例化。您需要考虑对象和关联,而不是列。尝试以下方法:
school_id
Student
SessionFactory
from School as s where not exists ( from Student as st where st.school = s and st.status.id not in (0,1,2,3,4) )