关于SQL 拼接的问题 请高手提供想法

比如现在又3个参数 a , b , c
现在要用这3个参数 任意的组合,或单独查符合条件的记录,比如

from User u where u.a=? and u.b=? u.c=?

现在要做 参数拼接

StringBuffer sb = new StringBuffer();
sb.append("from User u where ");

if(a!=null){
sb.append(" u.a=");
sb.append(a);
}
if(b!=null){
sb.append(" and u.b=");
sb.append(b);
}
if(c!=null){
sb.append(" and u.c=");
sb.append(c);
}

现在问题出来了 如果A不等于空的话出来的SQL语句是这样的 from User u where u.a=? and u.b=? and u.c=?;
如果A等于空的话 出来的SQL语句就是这样的 from User u where and u.b=? and u.c=?;

请问怎么才能想个办法 控制这个and 呢?

上面的答案也可以,不过貌似不太优雅,
可以这样
if(a!=null){

sb.append(" and u.a=");

sb.append(a);

}

if(b!=null){

sb.append(" and u.b=");

sb.append(b);

}

if(c!=null){

sb.append(" and u.c=");

sb.append(c);

}

sb.replace("and","");
StringUtils.replaceOnce(sb.toString(), "and", "");

每个条件都带and,最后替换下这样就可以了

[code="java"]
StringBuffer sb = new StringBuffer();
sb.append("from User u where 1=1 ");

if(a!=null){
sb.append(" and u.a=");
sb.append(a);
}
if(b!=null){
sb.append(" and u.b=");
sb.append(b);
}
if(c!=null){
sb.append(" and u.c=");
sb.append(c);
} [/code]

推荐二楼gdfloyd的答案!

gdfloyd 答案是我想的。不错。

我们一般的项目里也这么干,哈哈
不容易出错!

用hibernate的QBE,可以很好的解决sql接问题

StringBuffer sb = new StringBuffer();
sb.append("from User u where 1=1 ");

if(a!=null){
sb.append("u.a= and ");
sb.append(a);
}
if(b!=null){
sb.append("u.b= and ");
sb.append(b);
}
if(c!=null){
sb.append("u.c= and ");
sb.append(c);
}

result=sb.substring(0,sb.lastIndexOf("and"));
-->result为最后的结果

select * form user u where ((u.a is not null and u.a =?) or (u.a is null))
and ((u.b is not null and u.b =? ) or (u.b is null))
and ((u.c is not null and u.c =? ) or (u.c is null))

不好意思。
select * form user u where ((? is not null and u.a =?) or (? is null))
and ((? is not null and u.b =? ) or (? is null))
and ((? is not null and u.c =? ) or (? is null))
一个思路而已。

改进一下gdfloyd的代码
[code="java"]
StringBuffer sb = new StringBuffer();
sb.append("from User u where 1=1 ");
appendAnd(sb,"u.a", a);
appendAnd(sb,"u.b", b);
appendAnd(sb,"u.c", c);

void appendAnd(StringBuffer sb, String paramName, Object paramValue) {
    if(paramValue != null) {
        sb.append(" and ").append(paramName).append("=").append(paramValue);
        // 下面的方法比较优雅一点.但性能差点
        // sb.append(MessageFormat.format(" and {0}={1}", paramName, paraValue);
    }
}
[/code]

简单啊,初始化select语句时,where后面加个1=1就行了

StringBuffer sb1 = new StringBuffer();
if(a !=null && a.length() !=0){
sb1.append("and a = ");
sb1.append(" ? ");
}
if(b !=null && b.length() !=0){
sb1.append("and b = ");
sb1.append(" ? ");
}
if(c !=null && c.length() !=0){
sb1.append(" and c = ");
sb1.append(" ? ");
}
String sb1str = sb1.toString().substring(3,sb1.toString().length() );
sb.append(sb1str);
System.out.println(sb.toString());

一种小思路,根据需要适当处理