/* * 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.expression; import javax.persistence.Parameter; import jef.database.jsqlparser.visitor.Expression; import jef.database.jsqlparser.visitor.ExpressionType; import jef.database.jsqlparser.visitor.ExpressionVisitor; import jef.database.jsqlparser.visitor.FromItem; import jef.database.jsqlparser.visitor.SelectItemVisitor; import jef.tools.StringUtils; /** * A '?' in a statement * * @see JpqlDataType */ @SuppressWarnings("rawtypes") public class JpqlParameter implements Expression,FromItem,Parameter { /** * 参数名称, 对于 :name 类型的 */ private String name; /** * 参数序号 ,对于 ?1 类型的 */ private int index = -1; /** * 参数类型 */ private JpqlDataType type; private ThreadLocal<Object> resolved = new ThreadLocal<Object>(); //-1未解析 0已解析单参数 >0数组参数,需要对应多次绑定 String SQL片段 public String getName() { return name; } public JpqlDataType getDataType() { return type; } public boolean isNamedParam(){ return name!=null; } public boolean isIndexParam(){ return index>-1; } public int getIndex() { return index; } /** * -2 SQL片段 -1未解析 0单参数 >0数组参数 * @return */ public int resolvedCount(){ Object obj=resolved.get(); if(obj==null)return -1; if(obj instanceof String){ return -2; } return (Integer)obj; } public Object getResolved() { return resolved.get(); } public void setResolved(String text) { resolved.set(text); } /** * * @param resolved -2 SQL片段 -1未解析 0单参数 >0数组参数 */ public void setResolved(int resolved) { this.resolved.set(resolved); } public void setNotUsed(){ this.resolved.set(null); } public JpqlParameter(String str, boolean isNumber,String type) { if (isNumber) { this.index = Integer.valueOf(str); } else { this.name = str; } if(type!=null){ this.type=JpqlDataType.valueOf(type.toUpperCase()); } } public void accept(ExpressionVisitor expressionVisitor) { expressionVisitor.visit(this); } public void appendTo(StringBuilder sb) { String s=getReslovedString(); sb.append(s); if(!StringUtils.isEmpty(tableAlias)){ sb.append(' ').append(tableAlias); } } public String toString() { String s=getReslovedString(); if(StringUtils.isEmpty(tableAlias)){ return s; }else{ return StringUtils.concat(s," ",tableAlias); } } private String getReslovedString() { Object obj=resolved.get(); if(obj instanceof String){ return (String)obj; } Integer value=(Integer)obj; if(value==null || value<0){//未解析 if (name == null) { return "?".concat(String.valueOf(index)); } else { return ":".concat(name); } } if(value==0){//单参数 return "?"; }else{//value>0 StringBuilder sb=new StringBuilder("?"); StringUtils.repeat(sb,",?", value-1); return sb.toString(); } } public Object getKey() { if(name!=null)return name; return index; } public void accept(SelectItemVisitor fromItemVisitor) { fromItemVisitor.visit(this); } private String tableAlias; public String getAlias() { return tableAlias; } public void setAlias(String alias) { this.tableAlias=alias; } public String toWholeName() { return getReslovedString(); } public Integer getPosition() { return index; } public Class<?> getParameterType() { if(this.type==null)return Object.class; switch(this.type){ case $STRING: case $STRING$: case STRING$: case STRING: case SQL: return String.class; case BOOLEAN: return Boolean.class; case DATE: return java.sql.Date.class; case TIMESTAMP: return java.sql.Timestamp.class; case DOUBLE: return Double.class; case FLOAT: return Float.class; case INT: return Integer.class; case LONG: return Long.class; case SHORT: return Short.class; } return Object.class; } public ExpressionType getType() { return ExpressionType.param; } }