java - 在 JPQL 查询中设置可选参数

标签 java jpa filter jpql optional-parameters

I got this list of coins that i want to filter with that 3 optional parameters(Currency, quantity and year)

如何在 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/

相关文章:

尝试连接到 pc localhost 时出现 java.nio.charset.StandardCharsets 异常

java - 如何在 Spring JPA 应用程序中集成 paypal Rest api。错误代码 400

php - Laravel 糟糕的 wordfilter 作为助手

delphi - 如何根据嵌套数据集记录数过滤数据集?

java - 在Singleton中使用列表作为简单的内存缓存/数据库(Java)

java - 使用 Java 8 Streams 从不同类型的另一个集合更新集合

java - 使用 SimpleDateFormat 将字符串转换为日期时出现小时错误

java - 如何将基于Spring Boot 2.0.4构建的项目从mysql5迁移到mysql8?

java - 调试 MySQL 字符集错误

CSS 图像过滤器覆盖