查询失败,除非我重新排序SELECT语句中的值

时间:2015-10-22 15:15:45

标签: hibernate hql jpql

我正在尝试进行HQL查询,但如果我不重新排序SELECT语句中的值,我不明白为什么查询失败

以下查询不起作用

查询1

@Query("SELECT uf.flight.arrivalAirport.iataCode, uf.flight.flightStatus " +
        "FROM UserFlight uf WHERE uf.flight.id=?1 AND uf.user.id=?2")

生成SQL

select airport2_.iata_code as col_0_0_, 
flight1_.flight_status_id as col_1_0_, 
flightstat4_.id as id1_6_, 
flightstat4_.code as code2_6_, 
flightstat4_.description as descript3_6_ 
from user_flight userflight0_, 
flight flight1_, 
airport airport2_ 
inner join flight_status flightstat4_ 
on flight1_.flight_status_id=flightstat4_.id 
where userflight0_.flight_id=flight1_.id 
and flight1_.arrival_airport_id=airport2_.id 
and userflight0_.flight_id=? 
and userflight0_.user_id=?

异常

  

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unknown   'on clause'中的列'flight1_.flight_status_id'

如果我将查询更改为以下(仅重新排序SELECT值)

查询2

@Query("SELECT uf.flight.flightStatus, uf.flight.arrivalAirport.iataCode " +
        "FROM UserFlight uf WHERE uf.flight.id=?1 AND uf.user.id=?2")

生成SQL

select flight1_.flight_status_id as col_0_0_, 
airport4_.iata_code as col_1_0_, 
flightstat2_.id as id1_6_, 
flightstat2_.code as code2_6_, 
flightstat2_.description as descript3_6_ 
from user_flight userflight0_, 
flight flight1_ 
inner join flight_status flightstat2_ 
on flight1_.flight_status_id=flightstat2_.id, 
airport airport4_ 
where userflight0_.flight_id=flight1_.id 
and flight1_.arrival_airport_id=airport4_.id 
and userflight0_.flight_id=? 
and userflight0_.user_id=? 

它有效,我从数据库中得到结果。

有人可以告诉我为什么其中一个工作而另一个不工作?

注意:FlightStatus是一个实体而不是字符串值。

1 个答案:

答案 0 :(得分:1)

错误在于:

在第一个查询中,您有:

...
airport airport2_ 
inner join flight_status flightstat4_ 
on flight1_.flight_status_id=flightstat4_.id 
...

因此,口译员认为您要关联airport2_flighstat4_,因此ON条款不正确

相反,在第二个查询中,您有:

...
flight flight1_ 
inner join flight_status flightstat2_ 
on flight1_.flight_status_id=flightstat2_.id, 
...

关于两个表flight1_flighstat2_

的ON子句是正确的

修改

当你写:

SELECT uf.flight.arrivalAirport.iataCode, uf.flight.flightStatus

解释器按以下顺序分解对象:

处理第一个字段:

uf (user_flight) -> flight (flight) -> arrivalAirport (airport)

因此处理第二个字段:

uf (user_flight) -> flight (flight)

这两个对象已经存在于表中,因此它重用了它们,但是JOIN的顺序已经定义,所以你有第一个布局(有错误)。

当您更改字段的顺序时,第一个字段(第一个查询)已经由第一个处理,旧的第一个字段作为第二个字段处理,因此您有第二个lasyout没有错误。

我希望,我的解释清楚了:))