因为带有mybatis和spring的搜索过滤器会返回整个表

时间:2019-10-26 23:24:05

标签: java oracle mybatis

我正在使用spring和mybatis做一个搜索引擎,因此我必须按表中的两个记录进行过滤,因此在oracle文档中我获得了NVL函数,但无法成功将其实现到我的查询中

SELECT 
    FC.COD_FCD,
    FC.DSC_FCD, 
    DS.DSC_DSL ,
    FC.COD_EST_GNC, 
    FC.COD_HBT 
FROM SPFS_DT_FACUL FC 
INNER JOIN  SPFS_DT_DSPLG DS 
    ON FC.COD_DSL = DS.COD_DSL 
WHERE 
    (
        FC.COD_AB='01' 
        AND FC.COD_FCD LIKE #{value1}||'%'
    ) 
    OR (
        FC.COD_AB='01' 
        AND FC.DSC_FCD LIKE #{value2}||'%'
    )

我等待记录的过滤,但是整个表都返回给我

1 个答案:

答案 0 :(得分:0)

在Oracle中,任何非空值都在条件LIKE NULL || '%'上匹配。

我认为当一个(或两个)参数为null时,您正在尝试避免匹配条件。最简单的方法是明确检查是否为空:

SELECT 
    FC.COD_FCD,
    FC.DSC_FCD, 
    DS.DSC_DSL ,
    FC.COD_EST_GNC, 
    FC.COD_HBT 
FROM SPFS_DT_FACUL FC 
INNER JOIN  SPFS_DT_DSPLG DS 
    ON FC.COD_DSL = DS.COD_DSL 
WHERE 
    FC.COD_AB='01' 
    AND 
        ( #{value1} IS NOT NULL AND FC.COD_FCD LIKE #{value1}||'%' )
        OR ( #{value2} IS NOT NULL AND FC.COD_FCD LIKE #{value2}||'%' )
    ) 

还请注意,我将您的条件(A and B) or (A and C)分解为A and ( B or C`)。这使表达式更短,更易于理解。