2017-06-05 36 views
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; 
} 

回答

1

熱加工您是否嘗試過加入HAVING條款?

SELECT f, COUNT(t) 
FROM Flight f 
JOIN FETCH f.tickets AS t 
WHERE f.departureAirport=:departureAirport 
GROUP BY t.flight 
HAVING COUNT(t) < f.aircraft.model.passengersSeatsQuantity 
ORDER BY f.id ASC 
+0

我只是嘗試,並得到com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:在「having子句」 未知列「aircraftmo4_.passenger_seats_quantity」但飛機和模型有渴望獲取的政策,所以比綁添加JOIN f.aircraft JOIN f.aircraft.model並且沒有太大幫助(同樣的例外)。嗯,怪異的行爲 –

+0

我很確定'HAVING'就是你想要的。您可能必須整理出您自己的HQL,並且在您能夠掌握架構/實體之前,您最有可能做到這一點。 –

+0

好的,謝謝!我會繼續嘗試使它工作。只是更新了我的問題與其他信息 –