/* * JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jef.database.jsqlparser.statement.update; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import jef.common.Pair; import jef.database.jsqlparser.expression.Column; import jef.database.jsqlparser.expression.JpqlParameter; import jef.database.jsqlparser.parser.Token; import jef.database.jsqlparser.visitor.Expression; import jef.database.jsqlparser.visitor.FromItem; import jef.database.jsqlparser.visitor.Ignorable; import jef.database.jsqlparser.visitor.Statement; import jef.database.jsqlparser.visitor.StatementVisitor; /** * The update statement. */ public class Update implements Statement { /** * 其實只有兩種可能JPQL和table兩種可能 * @return */ private FromItem table; private Expression where; private List<Pair<Column,Expression>> sets=new ArrayList<Pair<Column,Expression>>();; private String hint; public void setSets(List<Pair<Column, Expression>> sets) { this.sets = sets; } public void setHint(Token t){ if(t!=null && t.specialToken!=null){ this.hint=t.specialToken.image; } } public void accept(StatementVisitor statementVisitor) { statementVisitor.visit(this); } public FromItem getTable() { return table; } public Expression getWhere() { return where; } public void setTable(FromItem name) { table = name; } public void setWhere(Expression expression) { where = expression; } public List<Pair<Column, Expression>> getSets() { return sets; } public Pair<Column, Expression> getSet(int i) { return sets.get(i); } public String getHint() { return hint; } public void setHint(String hint) { this.hint = hint; } public void addSet(Column c, Expression exp){ this.sets.add(new Pair<Column,Expression>(c,exp)); } public String toString() { StringBuilder sb = new StringBuilder("update "); if(hint!=null){ sb.append(hint).append(' '); } sb.append(table).append(" set "); int n=0; Iterator<Pair<Column,Expression>> iter=sets.iterator(); while(iter.hasNext()){ Pair<Column,Expression> pair=iter.next(); if(!isEmpty(pair)){ if(n>0) sb.append(','); pair.first.appendTo(sb); sb.append(" = "); pair.second.appendTo(sb); n++; } } if(where!=null){ appendWhere(sb,where); } return sb.toString(); } private boolean isEmpty(Pair<Column, Expression> pair) { Expression ex=pair.second; if(ex instanceof JpqlParameter){ return ((JpqlParameter) ex).getResolved()==null; } return false; } private void appendWhere(StringBuilder sb, Expression where) { if (where instanceof Ignorable) { if (((Ignorable) where).isEmpty()) { return; } } sb.append(" where "); int len = sb.length(); where.appendTo(sb); // 防止动态条件均为生效后多余的where关键字引起SQL错误 if (sb.length() - len < 2) { sb.setLength(len - 7); } } }