【问题标题】:Named query with optional parameter not working in mysql带有可选参数的命名查询在mysql中不起作用
【发布时间】:2013-10-22 21:54:06
【问题描述】:

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

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

【问题讨论】:

  • IS NULL 不会让你免于不提供任何价值:)
  • 但在其他帖子中,这是他们为可选参数提供的解决方案。
  • 当然是 50% 的解但是你必须将参数设置为null。正如我在回答中解释的那样,这是在null is null 返回true 的基础上工作的。
  • 这意味着我写的查询是正确的,我应该做些什么来使它工作
  • 尝试使用 CriteriaUpdate insted of NamedQuery as mentioned here

标签: mysql database hibernate


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 mostacho 的回复,但我将其保留为“:param IS NULL”,但这不起作用,这是我要问的
  • 正如我所说,the parameter has to be set always。将其设置为 NULL 以伪造匹配。
  • 谢谢,你能告诉我查询之后的样子吗,你能帮我解决一下吗
  • 正如我所说,leave the query the same way it is。然后,当您想省略参数时,而不是省略它们(这是不可能的),您应该将参数设置为null。这样查询就会像参数不存在一样运行。你明白了吗?
  • 你的按钮坏了吗?无论如何,在执行查询之前执行SET param := NULL; 之类的操作。
【解决方案2】:

我建议使用 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();
}

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2013-06-17
    • 2019-04-14
    • 2017-05-13
    • 1970-01-01
    • 2018-02-12
    • 2018-08-11
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多