带有可选参数的命名查询在mysql中不起作用

时间:2013-10-15 07:21:17

标签: mysql database hibernate

我在下面有一个可选参数的命名查询,即flightNumber,departureAirport和arrivalAirport。但是当我没有为这些参数赋值时,此查询无法正常工作。

@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注释

2 个答案:

答案 0 :(得分:1)

因此,您希望保持查询的方式,并使其在有或没有参数的情况下工作。好吧,你做不到。如果查询期望参数,则必须设置它们。

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

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

答案 1 :(得分:1)

我建议使用标准查询来构建带有自定义 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();
}