我在下面有一个可选参数的命名查询,即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注释
答案 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();
}