5

私は休止状態が初めてで、次の問題に遭遇しました。「参加に必要なパス!」という問題が発生しました。このクエリを実行しようとしたときの例外:

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! エラー

私のコードは次のとおりです。

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>

チケット.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();
4

1 に答える 1

15

リンク先の質問とHibernateのドキュメントで説明されているように、結合はエンティティ間の関連付けを使用します。したがって、正しいクエリは

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

また、クエリで値を直接連結するよりも、パラメーターを使用する方がはるかに優れたソリューションであることに注意してください。引用とエスケープを自動的に処理し、HQL インジェクションのリスクはありません。

于 2013-05-03T08:53:24.677 に答える