【问题标题】:HQL Join - Path expected for join! hibernateHQL 加入 - 预期加入的路径!休眠
【发布时间】:2013-04-27 14:36:43
【问题描述】:

我是 hibernate 新手,遇到了以下问题: 当我尝试运行此查询时,我得到 "Path expected for join!" 异常:

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 left join: Path expected for join hql inner join Path expected for join! error

我的代码是:

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

Ticket.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();

【问题讨论】:

    标签: sql hibernate hql


    【解决方案1】:

    正如您链接到的问题和Hibernate documentation 中所述,joins 使用实体之间的关联。所以正确的查询是

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

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

    【讨论】:

    • 谢谢。这解决了我的问题。正确的查询实际上是“select avg(t.price) from Ticket t join t.flight f where f.number = :flightNumber”
    • 糟糕。是的。我确定了答案。
    • inner join 在这种情况下是可选的,所以它可以写成更易读的形式:select svg(t.price) from Ticket t where t.flight.number = :flightNumber
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2018-07-16
    • 2011-08-11
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多