【问题标题】:How to add HQL clause (WHERE COUNT()< MAX_VAL) to complex query如何将 HQL 子句 (WHERE COUNT()< MAX_VAL) 添加到复杂查询
【发布时间】:2017-06-05 06:26:25
【问题描述】:

现在我的查询返回航班地图及其票数。 我的目标是从查询结果(count(t) &lt; f.aircraft.model.passengersSeatsQuantity) 中排除完整航班。但我无法创建这样的查询。因此,现在我必须在方法中排除完整的航班,这令人沮丧,因为我认为应该有办法在查询中做到这一点。任何人都可以帮助建立查询吗? p.s.我现在可以使用 Criteria API

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));
        }
    }

更新。 飞机和模型有急切的政策,但HAVING COUNT(t) &lt; 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;
}

【问题讨论】:

    标签: java hibernate jpa count hql


    【解决方案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
    

    【讨论】:

    • 我刚刚尝试并得到了 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'aircraftmo4_.passenger_seats_quantity' in 'having clause' 但是飞机和模型有急切的获取策略,所以绑定到添加 JOIN f.aircraft JOIN f.aircraft.model 并且这也没有帮助(同样的例外)。嗯,奇怪的行为
    • 我很确定 HAVING 是您想要的。您可能需要整理自己的 HQL,而且您最有可能在我之前做到这一点,因为您面前有架构/实体。
    • 好的,谢谢!我会继续努力让它发挥作用。刚刚用其他信息更新了我的问题
    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 2011-03-17
    • 2010-09-15
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多