Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带可选参数的命名查询在mysql中不起作用_Mysql_Database_Hibernate - Fatal编程技术网

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

带可选参数的命名查询在mysql中不起作用,mysql,database,hibernate,Mysql,Database,Hibernate,我在下面有一个可选参数的命名查询,该参数是flightNumber、departureAirport和arrivalAirport。但是当我没有为这些参数提供任何值时,这个查询就不起作用了 @Query("from CapacityMonitor where carrierCode = :carrierCode and (:flightNumber IS NULL OR flightNumber = :flightNumber) and (:departureAirport IS

我在下面有一个可选参数的命名查询,该参数是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 annotation一起使用,因此您希望保持查询的原样,并使其在有参数或无参数的情况下工作。嗯,你不能那样做。如果查询需要参数,则必须设置它们

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


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

我建议使用条件查询来构建带有自定义
WHERE
子句的语句

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

public List getFlights(字符串carrierCode、字符串flightNumber、字符串出发机场、字符串到达机场){
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(CapacityMonitor.class);
Root=query.from(CapacityMonitor.class);
查询。选择(根);
//承运人代码是强制性的
其中(builder.equals(root.get(“carrierCode”),carrierCode));
//其他属性是可选的
if(null!=flightNumber&&flightNumber.length()>0){
其中(builder.equals(root.get(“flightNumber”),flightNumber));
}
//使用LIKE表达式进行部分匹配
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+“%”);
}
返回em.createQuery(query.getResultList();
}

为NULL
不会使您免于不提供任何值:),但在其他帖子中,这是他们为可选参数提供的解决方案。当然,这是解决方案的50%,但您必须将参数设置为
NULL
。正如我在回答中所解释的那样,这是基于
null为null
返回
true
。这意味着我编写的查询是正确的,我应该做什么来使其工作尝试使用CriteriaUpdate而不是NamedQuery谢谢mostacho的回复,但我保留为“:param is null”但这不起作用,我在问,正如我所说,
必须始终设置参数。将其设置为
NULL
以伪造匹配。谢谢,你能告诉我在那之后我的查询会是什么样子吗?你能帮我解决这个问题吗正如我所说,
让查询保持原样。然后,如果要省略参数,而不是省略它们(这是不可能的),则应将参数设置为
null
。这样,查询将像不存在参数一样运行。你明白了吗?你的a按钮坏了吗?无论如何,执行类似于
SET param:=NULL的操作执行查询之前。
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();
}