处理SQL IN子句中的空值

时间:2014-09-18 05:25:18

标签: sql hibernate

我的hbm文件中有以下sql查询。 SCHEMA,A和B是模式和两个表。

              select
                *
              from SCHEMA.A os
              inner join SCHEMA.B o
                on o.ORGANIZATION_ID = os.ORGANIZATION_ID
              where
                case
                  when (:pass = 'N' and os.ORG_ID in (:orgIdList)) then 1
                  when (:pass = 'Y') then 1
                end = 1
                and (os.ORG_SYNONYM like :orgSynonym or :orgSynonym is null)

这是一个非常简单的查询。我不得不使用这个案例 - 何时处理" orgIdList"的空值。参数(当null传递给sql IN时会出错)。下面是设置参数的相关java代码。

        if (_orgSynonym.getOrgIdList().isEmpty()) {
            query.setString("orgIdList", "pass");
            query.setString("pass", "Y");
        } else {
            query.setString("pass", "N");
            query.setParameterList("orgIdList", _orgSynonym.getOrgIdList());
        }

这有效,并给我预期的输出。但我想知道是否有一种更好的方式来处理这种情况(orgIdList有时会变为null)。

1 个答案:

答案 0 :(得分:0)

逗号分隔列表中必须至少有一个元素定义IN表达式的值集。

换句话说,无论Hibernate解析查询和传递IN()的能力如何,无论特定数据库支持这种语法(PosgreSQL不根据Jira问题),最佳做法是使用如果您希望代码是可移植的,请在此处进行动态查询(我通常更喜欢使用Criteria API进行动态查询)。

如果不需要其他一些工作,就像你所做的那样。 或者从自定义列表中包装列表。

相关问题