当前位置: 首页 > 面试题库 >

Hibernate HQL中的“哪里存在”

宗政天逸
2023-03-14
问题内容

如何在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实例化。您需要考虑对象和关联,而不是列。尝试以下方法:

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

参考文献

  • Hibernate Core参考指南
    • 14.13。子查询


 类似资料:
  • 问题内容: Oracle数据库中存储的已加载Java类的Java字节码在哪里?具体来说,是否有一个视图或表可用于获取Oracle中Java类模式对象的原始字节? 问题答案: 如果使用CREATE JAVA SOURCE命令将Java Source加载到Oracle数据库中,则可以转到数据字典视图USER_SOURCE并找到您的Java Source。 如果需要显示它或其他内容,可以签出DBMS_J

  • 问题内容: 当我启用gomodules并构建go程序时,将下载所需的软件包。 但我不能找到他们或。 它们存储在哪里? 问题答案: 对于Go 1.11,它们存储在

  • 我刚刚开始阅读JWT,我相信我理解什么是JWT代币。我对会话也相当熟悉。我相信我了解每种方法的优点和缺点。然而,有几个部分我感到困惑。 当请求受保护的资源时,您需要在每次请求时发送jwt,而不是在服务器上存储会话。但是: 1)您如何存储您的JWT令牌以及在哪里。根据我所读到的,我知道您向服务器发送身份验证请求,如果您成功进行身份验证,服务器会向您发送JWT令牌。然后你会怎么做?,你会像我在一些网站

  • 我正在学习虚拟内存和自由空间管理。 我知道我们使用malloc分配的指针将请求堆中的一块内存。但是当我们调用malloc()系统调用时,它将返回一个整数作为专用内存块的地址,但是这个地址本身将存储在哪里呢? 假设 返回我的4008地址。它从4008到4022开始。这个块在堆中。但是4008本身在哪里? 它存储在堆栈中吗?

  • 问题内容: 临时表在哪里存储在数据库中?我想删除一个临时表(如果已经存在)。我可以通过查询信息模式来对安全表执行此操作,但是我不知道临时表的存储位置。 问题答案: 临时表存储在tempdb数据库中。这里概述了检查临时表是否存在的多种方法:检查是否存在临时表。

  • 方法存储在内存中的何处? Java中静态方法和静态变量存储在哪里?