obsession(执念) 2011-11-16 12:02
浏览 1994
已采纳

hibernate sql语句参数为null时,如何处理

使用hibernate时出现了点问题,现请教各位。

目的:
删除满足条件的数据。

出现问题:
参数为null时,程序出现异常。

问题描述:
之前代码如下:
[code="java"]
sql="delete table where pId=? and sId=?";
query.setParameter(0, pId);
query.setParameter(1, sId);
[/code]
现在遇到一个问题,就是如果参数传一个null的时候,hibernate不会将sql转换成is null,程序将会出现错误,所以修改成如下:
[code="java"]
//两个参数均不是主键
public void deleteTable(Long sId, Long pId) {
String sql = "delete table where 1=1";

    if (null == pId) {
        sql = sql + " and pIdis null";
    } else {
        sql = sql + " and pId=?";
    }

    if (null == sId) {
        sql = sql + " and sIdis null";
    } else {
        sql = sql + " and sId=?";
    }

    Query query = getSession().createQuery(sql);
            //这样判断简直让人崩溃,有啥好的处理方式?
    if (null != pId && null == sId) {
        query.setParameter(0, pId);
    }
    if (null != pId && null != sId) {
        query.setParameter(0, pId).setParameter(1, pId);
    }
    if (null == pId && null != sId) {
        query.setParameter(0, pId);
    }
    query.executeUpdate();
}

[/code]

这样是可以实现业务逻辑的,但是显然程序很笨重,不知到hibernate本身有没有灵活、优雅的方式解决这个问题?

  • 写回答

9条回答 默认 最新

  • vinceyu 2011-11-28 15:27
    关注

    我对hibernate也不是很熟悉,不过之前在使用ibatis的时候,直接使用动态sql就能很好的解决类似的问题。
    我想这类情况可以通过数据库的设置使代码简化,将以上2个变量的默认值设置为0,这样不管怎样2个字段都有值的(即永不为null),然后代码就可以改成:
    [code="java"]
    String sql = "delete table where 1=1 and pId=? and sId=?";

        Query query = getSession().createQuery(sql).setParameter(0, null==pId?0:pId).setParameter(1, null==sId?0:sId); 
    
        query.executeUpdate(); 
    

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?