当前位置: 首页 > 知识库问答 >
问题:

HQL加入-期望加入的路径!冬眠

包德业
2023-03-14

我刚开始Hibernate,遇到了以下问题:我得到了“加入的路径!” 尝试运行此查询时出现异常:

String hql = "select avg(t.price) from Ticket t JOIN Flight f WHERE f.number = '" + flightNumber + "'";
Query query = this.session.createQuery(hql);        
List<Double> list = query.list();

我想选择给定航班已售出的机票的平均价格。

我已经检查了这些链接,但我没有解决我的问题:HQL左连接:连接预期的路径hql内部连接预期的路径!错误

我的代码是:

航班.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="pck.Flight" table="flight" catalog="airbook">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <many-to-one name="sourceairport" class="pck.Sourceairport" fetch="select">
            <column name="sourceairportid" />
        </many-to-one>
        <many-to-one name="destinationairport" class="pck.Destinationairport" fetch="select">
            <column name="destinationairportid" />
        </many-to-one>
        <property name="number" type="string">
            <column name="number" length="30" />
        </property>
        <property name="date" type="timestamp">
            <column name="date" length="19" />
        </property>
        <property name="miles" type="java.lang.Integer">
            <column name="miles" />
        </property>
        <property name="numberofseats" type="java.lang.Integer">
            <column name="numberofseats" />
        </property>
        <property name="airplane" type="string">
            <column name="airplane" length="30" />
        </property>
        <set name="tickets" table="ticket" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="flightid" />
            </key>
            <one-to-many class="pck.Ticket" />
        </set>
    </class> </hibernate-mapping>

票据.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="pck.Ticket" table="ticket" catalog="airbook">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <many-to-one name="flight" class="pck.Flight" fetch="select">
            <column name="flightid" />
        </many-to-one>
        <many-to-one name="passenger" class="pck.Passenger" fetch="select">
            <column name="passengerid" />
        </many-to-one>
        <property name="price" type="java.lang.Double">
            <column name="price" precision="22" scale="0" />
        </property>
    </class>
</hibernate-mapping>

没有JOIN的所有其他查询都可以正常工作。我不知道问题出在哪里。

正确的问题是:

select avg(t.price) from Ticket t join t.flight f where f.number = :flightNumber

连同查询执行:

Transaction tx = session.beginTransaction(); 
String hql = "select avg(t.price) from Ticket t join t.flight f where f.number = :flightNumber";
Query query = this.session.createQuery(hql).setString("flightNumber", flightNumber); 
List<Double> list = query.list();  
tx.commit();

共有1个答案

贾飞鸿
2023-03-14

正如您链接到的问题和Hibernate留档中解释的那样,连接使用实体之间的关联。所以正确的查询是

select avg(t.price) from Ticket t join t.flight f where f.number = :flightNumber

还要注意,使用参数是比在查询中直接连接值更好的解决方案。它自动处理引用和转义,没有任何HQL注入的风险。

 类似资料:
  • 问题内容: 我刚进入休眠状态,遇到了以下问题:我收到了 “希望加入的路径!” 当我尝试运行此查询时出现异常: 我的代码是: Flight.hbm.xml Ticket.hbm.xml 所有其他没有JOIN的查询都可以正常工作。我不知道问题出在哪里。 正确的查询是: 并与查询执行一起: 问题答案: 如您所链接的问题和Hibernate文档中所述,实体之间的连接使用关联。所以正确的查询是 还要注意,与

  • 问题内容: 我刚进入hibernate状态,遇到了以下问题:我收到了 “希望加入的路径!” 当我尝试运行此查询时出现异常: 我想选择给定航班已售出机票的平均价格。 我的代码是: Flight.hbm.xml Ticket.hbm.xml 所有其他没有JOIN的查询都可以正常工作。我不知道问题出在哪里。 正确的查询是: 并与查询执行一起: 问题答案: 如您所链接的问题和Hibernate文档中所述,

  • 问题内容: HQL连接查询有问题。谁能告诉我我的下面加入HQL查询有什么问题?我正在使用Hibernate 4.3.6,JDK 7和Groovy 2.2 我在上面的代码中运行时遇到以下错误 以下是我的包裹实体 以下是我的TransportFile实体 我参考了这篇文章HQL左联接:联接所需的路径,但是我的HQL联接查询没有任何磨损。 问题答案: 此异常 “预期加入的路径” 表示: 提供从一个实体到

  • 问题内容: 我有以下课程: 我想获取在类别中指定ID的广告资源。我正在尝试使用这个 我真的很困惑,请帮忙。谢谢。 问题答案: 好吧,没关系,我知道了怎么做 因此,我实际上想知道如何将类别与联接相关联,我在HQL文档中的“多态查询”下找到了答案。

  • 问题内容: 我有2个实体,和。它们是相关的,但是我不想将关系映射添加到bean。 我们如何 在 HQL或条件之间使用 左外部 联接 并 使用它们 ? 有一些解决方法, 按照此处所述使用本机SQL 。 添加关系并使用 从A选择a a左连接ab 。 我们可以在HQL中进行 内部 联接,例如从A a,B b中选择*,其中a.some = b.some 我一直回头看这两个选项,这还有其他选择吗?还是这不可

  • 问题内容: 可以说我有两个表(A,B),例如: 我也有他们的实体。我想编写一个HQL,以便结果集类似于(其中Ac = Bc): 由于hibernate不支持子句,因此我很困,而且我不知道如何编写查询。 问题答案: 您必须使用交叉联接表示法: 当然,没有办法以这种方式实现外部联接,因此,在这种情况下,您可能会遇到一些麻烦。