SQL HQL Join - 预期加入的路径!休眠
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16354705/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
HQL Join - Path expected for join! hibernate
提问by user1326050
I am new to hibernate and I met a following problem: I got "Path expected for join!"exception when I tried to run this query:
我是 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();
I wanted to select average price of tickets that have been sold for a given flight.
我想选择给定航班已售出的机票的平均价格。
I have checked these links, but I did not solve my problem: HQL left join: Path expected for joinhql inner join Path expected for join! error
我检查了这些链接,但我没有解决我的问题: HQL left join: Path expected for join hql inner join Path expected for join!错误
My code is:
我的代码是:
Flight.hbm.xml
航班.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
票证.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>
All the other queries without JOIN work fine. I do not know where the problem is.
没有 JOIN 的所有其他查询都可以正常工作。我不知道问题出在哪里。
The correct query is:
正确的查询是:
select avg(t.price) from Ticket t join t.flight f where f.number = :flightNumber
And altogether with query execution:
和查询执行一起:
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();
回答by JB Nizet
As explained in the question you linked to, and in the Hibernate documentation, joins use associations between entities. So the correct query is
正如您链接到的问题和Hibernate 文档中所述,联接使用实体之间的关联。所以正确的查询是
select avg(t.price) from Ticket t join t.flight f where f.number = :flightNumber
Also note that using parameters is a much better solution than concatenating values directly in the query. It handles quoting and escaping automatically, and doesn't have any risk of HQL injection.
另请注意,使用参数是比直接在查询中连接值更好的解决方案。它会自动处理引用和转义,并且没有任何 HQL 注入的风险。