如何在 JPQL 中使用“if else”或“case when”

Posted

技术标签:

【中文标题】如何在 JPQL 中使用“if else”或“case when”【英文标题】:How to use "if else" or "case when" in JPQL 【发布时间】:2021-05-27 20:53:57 【问题描述】:

我在 mysql 中有这样的查询:

SELECT am.*
FROM bettha_adherence_area_manager am
         INNER JOIN bettha_adherence_area aa ON am.bettha_adherence_area_id = aa.id
         INNER JOIN selection_process sp ON aa.selection_process_id = sp.selection_process_id
         INNER JOIN company_country cc ON sp.company_country_id = cc.company_country_id
         INNER JOIN bettha_adherence_area_manager_execution baame
                    on am.bettha_adherence_area_manager_id = baame.bettha_adherence_area_manager_id
WHERE cc.company_country_id = :companyCountryId
  AND (LOWER(am.email) LIKE LOWER(CONCAT('%', :search, '%')) OR
       LOWER(am.full_name) LIKE LOWER(CONCAT('%', :search, '%')))
  AND IF(:isFinished IS NOT NULL, IF(baame.finished_date IS NOT NULL, :isFinished, NOT :isFinished), TRUE)
GROUP BY am.email;

或者像这样:

SELECT am.* FROM bettha_adherence_area_manager am
               INNER JOIN bettha_adherence_area aa ON am.bettha_adherence_area_id = aa.id
               INNER JOIN selection_process sp ON aa.selection_process_id = sp.selection_process_id
               INNER JOIN company_country cc ON sp.company_country_id = cc.company_country_id
               INNER JOIN bettha_adherence_area_manager_execution baame on am.bettha_adherence_area_manager_id = baame.bettha_adherence_area_manager_id
            WHERE cc.company_country_id = :companyCountryId AND
               (LOWER(am.email) LIKE LOWER(CONCAT('%', :search, '%')) OR
               LOWER(am.full_name) LIKE LOWER(CONCAT('%', :search, '%'))) AND
               CASE WHEN (:isFinished IS NOT NULL) THEN (
                   CASE WHEN (baame.finished_date IS NOT NULL) THEN
                       (:isFinished)
                   ELSE
                       NOT :isFinished END
               )
               ELSE TRUE END
            GROUP BY am.email;

两个查询都做同样的事情。我想将其中一个查询转换为 JPQL,但是 JPQL 中不存在“if else”,并且“case when”也不能那样工作。

在 JPQL 中如何查询?

【问题讨论】:

【参考方案1】:

在 if else 或 case when i.e. 的情况下尝试使用 OR AND,

CASE WHEN (:isFinished IS NOT NULL) THEN (
      CASE WHEN (baame.finished_date IS NOT NULL) THEN
            (:isFinished)
       ELSE
             NOT :isFinished END
  )

这个条件可以写成

((:isFinished IS NULL) OR (
      ((baame.finished_date IS NOT NULL) AND (:isFinished=1))
             OR
       ((baame.finished_date IS NULL) AND (:isFinished=0))
  )

对于整个 JPQL 查询,我们需要首先查看实体类,因为 JPQL 使用类而不是表名来编写查询。

【讨论】:

以上是关于如何在 JPQL 中使用“if else”或“case when”的主要内容,如果未能解决你的问题,请参考以下文章

如何仅检索 JPQL 或 HQL 中实体的某些字段? JPQL 或 HQL 中的 ResultSet 等价物是啥?

如何在php中使用if else条件与Join

如何在多个if / else条件下使用Throws?

在 JavaScript 中使用媒体查询或在 CSS 中使用 if/else 语句

如何在带有参数的 s-s-rS 查询设计器中使用 IF ELSE 语句?

如何在 JPQL 中进行“深度”获取连接?