【问题标题】:Spring Data JPQL How to create a query with dynamic where clause?Spring Data JPQL 如何使用动态 where 子句创建查询?
【发布时间】:2019-05-20 16:54:37
【问题描述】:

我正在创建自定义 JPQL 查询来获取一些数据。 在某些情况下,我想根据参数值是否为非空来添加 where 子句。

例如等价的sql查询:

//If parameter status is not null.
SELECT sum(A.sal) FROM TABLE A WHERE A.STATUS = 'X' GROUP BY A.CURRENCY;

//else
SELECT sum(A.sal) FROM TABLE A GROUP BY A.CURRENCY;

谁能帮帮我。

【问题讨论】:

  • 查看 querydsl 支持或规范。
  • 你的例子中是 JPQL 吗?它看起来更像是一个普通的 SQL 查询(尽管这个 table 关键字对我来说似乎是错误的。如果参数的这种可空性是唯一的 if-else 情况,那么您可以将它包装在一个查询中,而无需做任何事情“动态”
  • 为简单起见,我只指定了两个,一般会更多,也是的,这些都是 SQL 形式,实际上我是使用构造函数将结果集映射到非实体 pojo。

标签: mysql spring-boot spring-data-jpa spring-data


【解决方案1】:

两个查询:

//If parameter status is not null.
SELECT sum(A.sal) FROM TABLE A WHERE A.STATUS = 'X' GROUP BY A.CURRENCY;

//else
SELECT sum(A.sal) FROM TABLE A GROUP BY A.CURRENCY;

可以压缩为一个。

首先让我们声明一个命名参数statusParam。这个参数可以取任何值(比如上面的'X'null)。所以上面的两个查询可以重写为:

SELECT sum(A.sal) FROM A WHERE (A.STATUS = :statusParam OR :statusParam is null ) GROUP BY A.CURRENCY;

【讨论】:

    【解决方案2】:

    来吧,JPQL 只是普通的字符串 :) 你想要这样的东西吗?

    private String generateHql(String status) {
    String jpql = "SELECT sum(A.sal) FROM TABLE A ";
    if (null != status) {
     jpql += "WHERE A.STATUS = " +status ;
    }
    jpql += " GROUP BY A.CURRENCY "
    return jpql;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 2020-12-23
      • 2020-06-19
      • 2021-08-10
      • 2011-01-31
      • 2019-10-03
      • 2020-06-05
      • 2015-09-20
      相关资源
      最近更新 更多