比如现在又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());
一种小思路,根据需要适当处理