⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqlfunctiontemplate.java

📁 一个Java持久层类库
💻 JAVA
字号:
//$Id: SQLFunctionTemplate.java 6608 2005-04-29 15:32:30Z oneovthafew $package org.hibernate.dialect.function;import org.hibernate.QueryException;import org.hibernate.engine.Mapping;import org.hibernate.engine.SessionFactoryImplementor;import org.hibernate.type.Type;import java.util.ArrayList;import java.util.List;/** * Represents HQL functions that can have different representations in different SQL dialects. * E.g. in HQL we can define function <code>concat(?1, ?2)</code> to concatenate two strings  * p1 and p2. Target SQL function will be dialect-specific, e.g. <code>(?1 || ?2)</code> for  * Oracle, <code>concat(?1, ?2)</code> for MySql, <code>(?1 + ?2)</code> for MS SQL. * Each dialect will define a template as a string (exactly like above) marking function  * parameters with '?' followed by parameter's index (first index is 1). * * @author <a href="mailto:alex@jboss.org">Alexey Loubyansky</a> * @version <tt>$Revision: 6608 $</tt> */public class SQLFunctionTemplate implements SQLFunction {	private final Type type;	private final boolean hasArguments;	private final boolean hasParenthesesIfNoArgs;	private final String template;	private final String[] chunks;	private final int[] paramIndexes;	public SQLFunctionTemplate(Type type, String template) {		this( type, template, true );	}	public SQLFunctionTemplate(Type type, String template, boolean hasParenthesesIfNoArgs) {		this.type = type;		this.template = template;		List chunkList = new ArrayList();		List paramList = new ArrayList();		StringBuffer chunk = new StringBuffer( 10 );		StringBuffer index = new StringBuffer( 2 );		for ( int i = 0; i < template.length(); ++i ) {			char c = template.charAt( i );			if ( c == '?' ) {				chunkList.add( chunk.toString() );				chunk.delete( 0, chunk.length() );				while ( ++i < template.length() ) {					c = template.charAt( i );					if ( Character.isDigit( c ) ) {						index.append( c );					}					else {						chunk.append( c );						break;					}				}				paramList.add( new Integer( Integer.parseInt( index.toString() ) - 1 ) );				index.delete( 0, index.length() );			}			else {				chunk.append( c );			}		}		if ( chunk.length() > 0 ) {			chunkList.add( chunk.toString() );		}		chunks = ( String[] ) chunkList.toArray( new String[chunkList.size()] );		paramIndexes = new int[paramList.size()];		for ( int i = 0; i < paramIndexes.length; ++i ) {			paramIndexes[i] = ( ( Integer ) paramList.get( i ) ).intValue();		}		hasArguments = paramIndexes.length > 0;		this.hasParenthesesIfNoArgs = hasParenthesesIfNoArgs;	}	/**	 * Applies the template to passed in arguments.	 * @param args function arguments	 *	 * @return generated SQL function call	 */	public String render(List args, SessionFactoryImplementor factory) {		StringBuffer buf = new StringBuffer();		for ( int i = 0; i < chunks.length; ++i ) {			if ( i < paramIndexes.length ) {				Object arg = paramIndexes[i] < args.size() ? args.get( paramIndexes[i] ) : null;				if ( arg != null ) {					buf.append( chunks[i] ).append( arg );				}			}			else {				buf.append( chunks[i] );			}		}		return buf.toString();	}	// SQLFunction implementation	public Type getReturnType(Type columnType, Mapping mapping) throws QueryException {		return type;	}	public boolean hasArguments() {		return hasArguments;	}	public boolean hasParenthesesIfNoArguments() {		return hasParenthesesIfNoArgs;	}		public String toString() {		return template;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -