1

我在下面有一个命名查询,用于可选参数,即航班号、出发机场和到达机场。但是当我没有为这些参数提供任何值时,此查询不起作用。

@Query("from CapacityMonitor
  where carrierCode = :carrierCode and
  (:flightNumber IS NULL OR flightNumber = :flightNumber) and 
  (:departureAirport IS NULL OR departureAirport = :departureAirport) and
  (:arrivalAirport IS NULL OR arrivalAirport = :arrivalAirport)

我可以更改查询,但我只能使用 @Query 注释

4

2 回答 2

1

因此,您希望保持查询原样,并使其在有或没有参数的情况下工作。好吧,你不能那样做。如果查询需要参数,那么您必须设置它们。

最好的方法是让查询保持原样,并将参数设置为,NULL以便在这些情况下:param IS NULL返回TRUE并返回所有结果。这样你就会假装一场比赛。

无论如何,必须始终设置参数。

于 2013-10-15T07:34:14.140 回答
1

我建议使用Criteria Query来构建带有自定义WHERE子句的语句。

根据您的示例,它可能如下所示(取决于您的数据类型):

public List<CapacityMonitor> getFlights(String carrierCode, String flightNumber, String departureAirport, String arrivalAirport) {
  CriteriaBuilder builder = em.getCriteriaBuilder();
  CriteriaQuery<CapacityMonitor> query = builder.createQuery(CapacityMonitor.class);

  Root<CapacityMonitor> root = query.from(CapacityMonitor.class);
  query.select(root);

  // Carrier code is mandatory
  query.where(builder.equals(root.get("carrierCode"), carrierCode));

  // Other properties are optional
  if (null != flightNumber && flightNumber.length() > 0) {
    query.where(builder.equals(root.get("flightNumber"), flightNumber));
  }

  // Use LIKE expression to match partially
  if (null != departureAirport && departureAirport.length() > 0) {
    query.where(builder.like(root.get("departureAirport"), "%" + departureAirport + "%"));
  }

  if (null != arrivalAirport && arrivalAirport.length() > 0) {
    query.where(builder.like(root.get("arrivalAirport"), "%" + arrivalAirport + "%"));
  }

  return em.createQuery(query).getResultList();
}
于 2021-04-26T07:52:40.893 回答