如何在 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 等价物是啥?
在 JavaScript 中使用媒体查询或在 CSS 中使用 if/else 语句