我是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();
Run Code Online (Sandbox Code Playgroud)
我想选择已经为特定航班出售的机票的平均价格.
我已经检查了这些链接,但是我没有解决我的问题: HQL左连接:加入 hql内连接的路径期望加入的路径!错误
我的代码是:
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
没有JOIN的所有其他查询工作正常.我不知道问题出在哪里.
正确的查询是:
select avg(t.price) from Ticket t join t.flight f where f.number = :flightNumber
Run Code Online (Sandbox Code Playgroud)
并且与查询执行完全一致:
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();
Run Code Online (Sandbox Code Playgroud)
JB *_*zet 15
正如您在链接的问题中所解释的那样,在Hibernate文档中,连接使用实体之间的关联.所以正确的查询是
select avg(t.price) from Ticket t join t.flight f where f.number = :flightNumber
Run Code Online (Sandbox Code Playgroud)
另请注意,使用参数比直接在查询中连接值要好得多.它自动处理引用和转义,并且没有任何HQL注入风险.
| 归档时间: |
|
| 查看次数: |
35737 次 |
| 最近记录: |