带可选参数的命名查询在mysql中不起作用
我在下面有一个可选参数的命名查询,该参数是flightNumber、departureAirport和arrivalAirport。但是当我没有为这些参数提供任何值时,这个查询就不起作用了带可选参数的命名查询在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
@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();
}