“在哪里存在”在Hibernate HQL中 [英] "where exists" in Hibernate HQL

查看:204
本文介绍了“在哪里存在”在Hibernate HQL中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在HQL中编写不存在查询?我试图获得一个不存在的HQL查询,它返回与此Oracle SQL查询相同的结果:

  select * 
从SCHOOL a
不存在(从STUDENT中选择1
b
其中B.SCHOOL_ID = a.id
和B.STATUS_ID不在(0,1,2, 3,4))

我的映射文件如下:




 <! - 主键ommitted  - > 
< set name =students
cascade =allfetch =selectlazy =false>
< key column =SCHOOL_ID/>
< / set>
< / class>




 <! - 主键ommitted  - > 
<多对一名称=学校
列=SCHOOL_ID
class =com.companyname.Schoolfetch =joinlazy =false/> ;

class =com.companyname.Statuscolumn =STATUS_ID/>
< / class>











我在我的School.hbm.xml文件中尝试了以下标记:

 < query name =myQuery> 
<![CDATA [
from School s不存在于学生st
where st.school_id = s.id and st.status.id not in(0,1,2, 3,4)
]]>
< / query>

我得到了这个堆栈跟踪

  org.springframework.beans.factory.BeanCreationException:在类路径资源[applicationContext.xml]中定义名称为'sessionFactory'的bean时出错:init方法的调用失败;嵌套异常是java.lang.NullPointerException 
由org.hibernate.hql.ast.HqlParser.negateNode(HqlParser.java:117)处的
导致:java.lang.NullPointerException
。 hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2378)
位于org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2331)
位于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。逻辑表达式(HqlBaseParser.java:1858)
在org.hibernate.hql.antlr.HqlBaseParser.whereClause(HqlBaseParser.java:454)
在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(HqlB aseParser.java:159)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:248)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:
at org.hibernate.engine.query.HQLQueryPlan。< init>(HQLQueryPlan.java:77)org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)

在org.hibernate.engine.query.HQLQueryPlan。< init>(HQLQueryPlan.java:56)
在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)

有人能让我知道我做错了什么吗?

c>不是 Student 实体)的属性,从而防止 SessionFactory 被实例化。你需要考虑对象和关联,而不是列。试试这个:

  from School作为s 
不存在(
from Student as st
where st.school = s
和st.status.id不在(0,1,2,3,4)


$ b $ h


$ b
  • Hibernate核心参考指南



  • How can I write a "not exists" query in HQL? I am trying to get an HQL not exists query which returns the same results as this Oracle SQL query:

    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))
    

    My mapping files are below:

      <!-- 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>
    

    I tried the following tag in my School.hbm.xml file

    <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>
    

    and I got this stack trace

    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)
    

    Can somebody let me know what I'm doing wrong?

    Thank you!

    解决方案

    Your named query is not valid (school_id is not a property of the Student entity), which prevents the SessionFactory from being instantiated. You need to think object and associations, not columns. Try this instead:

    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)
    )
    

    References

    这篇关于“在哪里存在”在Hibernate HQL中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆