【问题标题】:How to use "if else" or "case when" in JPQL如何在 JPQL 中使用“if else”或“case when”
【发布时间】: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 中如何查询?

【问题讨论】:

    标签: java mysql jpa spring-data 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 使用类而不是表名来编写查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2018-05-21
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多