2013-05-03 95 views
4

我是新来的休眠,我遇到了以下问题: 我得到了“加入的路径!”例外,当我试图运行此查询:HQL加入 - 加入的路径!休眠

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

回答

14

如您链接到的问题说明,并在Hibernate documentation,加入之间利用关联实体。所以正确的查询是

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

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

+0

谢谢。这解决了我的问题。正确的查询实际上是“从Ticket t中选择avg(t.price)”t join t.flight f其中f.number =:flightNumber“ – user1326050 2013-05-03 09:10:27

+0

糟糕。是。我确定了答案。 – 2013-05-03 09:11:59

+1

在这种情况下,内部连接是可选的,因此它可以以更易读的形式写入:'从Ticket t中选择svg(t.price),其中t.flight.number =:flightNumber' – 2013-05-03 10:30:40