如何在 JPQL 中将参数设置为可选?我不想做 9 个“if else”来检查它是否为 null
我得到了 filtradoMonedas (filterCoins) 函数,它使用这 3 个可选参数过滤对象 Moneda(coin),但如果有一个空参数,它就不起作用。
如果不设置空参数,如果 cantidad 或 ano 是 ""返回错误查询的异常,这就很好用。只是想把它作为一个可选的。方法如下:
public List<Moneda> filtradoMonedas(Divisa divisa, BigDecimal cantidad,
BigDecimal ano){
EntityManager em = getEntityManager();
Query consulta = em.createQuery("SELECT m FROM Moneda m "
+ "WHERE m.divisa = :divisa "
+ "AND m.cantidad= :cantidad "
+ "AND m.ano = :ano");
consulta.setParameter("divisa", divisa);
consulta.setParameter("cantidad", cantidad);
consulta.setParameter("ano", ano);
List<Moneda> filtradoMonedas = (List<Moneda>) consulta.getResultList();
// sincronizar los objetos devueltos con la base de datos
for (Moneda m : filtradoMonedas) {
em.refresh(m);
}
em.close();
return filtradoMonedas;
}
最佳答案
在阅读了 Ilya Dyoshin 的评论以及“你应该认为不是参数是可选的,而是条件是可选的”背后的聪明想法之后,我决定通过使用带有 @Query 注释的 JPQL 来走我自己的路,并创建一个运行良好的动态 SQL 查询。
关键是应用一些 SQL 逻辑使条件成为可选的而不是参数:
@Query("SELECT a " +
"FROM amazing " +
"WHERE (:filterSuperAwesome IS NULL " +
"OR a.filterSuperAwesome = :filterSuperAwesome)");
List<FilterSuperAwesome> filterAwesomeORSuperAwesome(
@Param("filterSuperAwesome ") FilterSuperAwesome filterSuperAwesome);
请注意这里 ☝️,我使用 OR 语句基于我的参数可以呈现两种形式的事实,一个 FilterSuperAwesome 实例或 NULL。当为 NULL 时,条件始终为 True,就好像它不存在一样。
这在 JHipster 项目的 JpaRepository 类中工作得很好。
关于java - 在 JPQL 查询中设置可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50569238/