0
现在我的查询返回航班地图和其票数。 我的目标是从查询结果(count(t) < f.aircraft.model.passengersSeatsQuantity)
中排除完整航班。但我无法设法创建这样的查询。因此,现在我必须排除方法中的全部航班,这是令人沮丧的,因为我认为在查询中应该有办法做到这一点。任何人都可以帮助建立查询?附:我现在被允许使用Criteria API如何将HQL子句(WHERE COUNT()<MAX_VAL)添加到复杂查询
String queryString = "SELECT f, COUNT(t)"
+ " FROM Flight f"
+ " JOIN FETCH f.tickets AS t"
+ " WHERE f.departureAirport=:departureAirport"
+ " GROUP BY t.flight"
+ " ORDER BY f.id ASC";
Query query = em.createQuery(queryString);
query.setParameter("departureAirport", departureAirport);
Map<Flight, Long>) flightsTicketCountMap =
query.getResultList().stream()
.collect(Collectors.toMap(resultElement -> (Flight) (((Object[]) resultElement)[0]),
resultElement -> (Long) (((Object[]) resultElement)[1])));
//below i exclude full flights from map, but i want to do it in query
Map<Flight, Long> availableFlightTicketPriceMap = new HashMap();
for (Map.Entry<Flight, Long> entry : flightsTicketCountMap.entrySet()) {
flight = entry.getKey();
ticketsQuantity = entry.getValue();
if (flight.getAircraft().getModel().getPassengersSeatsQuantity() > ticketsQuantity) {
availableFlightTicketPriceMap.put(flight, calculateTicketPrice(tariffsDetails, flight, ticketsQuantity));
}
}
UPDATE。 飞机和模型有跃跃欲试的政策,但HAVING COUNT(t) < f.aircraft.model.passengersSeatsQuantity
有例外com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column aircraftmo3_.passenger_seats_quantity in having clause
public class Flight{
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "aircraft_id")
private Aircraft aircraft;
}
public class Aircraft{
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "model_id")
private AircraftModel model;
}
public class AircraftModel{
@Column(name = "passenger_seats_quantity")
@Range(min = 0, max = 450)
private Integer passengersSeatsQuantity;
}
我只是尝试,并得到com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:在“having子句” 未知列“aircraftmo4_.passenger_seats_quantity”但飞机和模型有渴望获取的政策,所以比绑添加JOIN f.aircraft JOIN f.aircraft.model并且没有太大帮助(同样的例外)。嗯,怪异的行为 –
我很确定'HAVING'就是你想要的。您可能必须整理出您自己的HQL,并且在您能够掌握架构/实体之前,您最有可能做到这一点。 –
好的,谢谢!我会继续尝试使它工作。只是更新了我的问题与其他信息 –