📄 abstractqueryimpl.java
字号:
//$Id: AbstractQueryImpl.java,v 1.32 2005/04/13 07:37:49 oneovthafew Exp $package org.hibernate.impl;import java.io.Serializable;import java.math.BigDecimal;import java.math.BigInteger;import java.util.ArrayList;import java.util.Arrays;import java.util.Calendar;import java.util.Collection;import java.util.Date;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Locale;import java.util.Map;import java.util.Set;import java.util.StringTokenizer;import org.hibernate.CacheMode;import org.hibernate.FlushMode;import org.hibernate.Hibernate;import org.hibernate.HibernateException;import org.hibernate.MappingException;import org.hibernate.NonUniqueResultException;import org.hibernate.PropertyNotFoundException;import org.hibernate.Query;import org.hibernate.QueryException;import org.hibernate.engine.QueryParameters;import org.hibernate.engine.RowSelection;import org.hibernate.engine.SessionImplementor;import org.hibernate.engine.TypedValue;import org.hibernate.hql.classic.ParserHelper;import org.hibernate.property.Getter;import org.hibernate.proxy.HibernateProxyHelper;import org.hibernate.type.SerializableType;import org.hibernate.type.Type;import org.hibernate.type.TypeFactory;import org.hibernate.util.ArrayHelper;import org.hibernate.util.MarkerObject;import org.hibernate.util.ReflectHelper;import org.hibernate.util.StringHelper;/** * Abstract implementation of the Query interface * @author Gavin King, Max Andersen */public abstract class AbstractQueryImpl implements Query { private static final Object UNSET_PARAMETER = new MarkerObject("<unset parameter>"); private static final Object UNSET_TYPE = new MarkerObject("<unset type>"); private String queryString; private final SessionImplementor session; private RowSelection selection; private List values = new ArrayList(4); private List types = new ArrayList(4); private int positionalParameterCount = 0; private Set actualNamedParameters = new HashSet(4); private Map namedParameters = new HashMap(4); private Map namedParameterLists = new HashMap(4); private boolean cacheable; private String cacheRegion; private String comment; private FlushMode flushMode; private CacheMode cacheMode; private FlushMode sessionFlushMode; private CacheMode sessionCacheMode; private Serializable collectionKey; private boolean readOnly; public AbstractQueryImpl(String queryString, FlushMode flushMode, SessionImplementor session) { this.session = session; this.queryString = queryString; this.selection = new RowSelection(); this.flushMode = flushMode; this.cacheMode = null; initParameterBookKeeping(); } public final String getQueryString() { return queryString; } public Query setFlushMode(FlushMode flushMode) { this.flushMode = flushMode; return this; } public Query setCacheMode(CacheMode cacheMode) { this.cacheMode = cacheMode; return this; } protected Map getNamedParams() { return new HashMap(namedParameters); } protected void verifyParameters() throws QueryException { verifyParameters(false); } /** * @param reserveFirstParameter if true, the first ? will not be verified since its needed for e.g. callable statements returning a out parameter * @throws HibernateException */ protected void verifyParameters(boolean reserveFirstParameter) throws HibernateException { if ( actualNamedParameters.size() != namedParameters.size() + namedParameterLists.size() ) { Set missingParams = new HashSet(actualNamedParameters); missingParams.removeAll( namedParameterLists.keySet() ); missingParams.removeAll( namedParameters.keySet() ); throw new QueryException( "Not all named parameters have been set: " + missingParams, getQueryString() ); } int positionalValueSpan = 0; for ( int i=0; i<values.size(); i++ ) { Object object = types.get(i); if( values.get(i)==UNSET_PARAMETER || object==UNSET_TYPE ) { if(reserveFirstParameter && i==0) { continue; } else { throw new QueryException( "Unset positional parameter at position: " + i, getQueryString() ); } } positionalValueSpan += ( (Type) object ).getColumnSpan( session.getFactory() ); } if ( positionalParameterCount!=positionalValueSpan ) { if(reserveFirstParameter && positionalParameterCount-1!=positionalValueSpan) { throw new QueryException( "Expected positional parameter count: " + (positionalParameterCount-1) + ", actual parameters: " + values, getQueryString() ); } else if (!reserveFirstParameter) { throw new QueryException( "Expected positional parameter count: " + positionalParameterCount + ", actual parameters: " + values, getQueryString() ); } } } protected Map getNamedParameterLists() { return namedParameterLists; } protected List getValues() { return values; } protected List getTypes() { return types; } //TODO: maybe call it getRowSelection() ? public RowSelection getSelection() { return selection; } public Query setMaxResults(int maxResults) { selection.setMaxRows( new Integer(maxResults) ); return this; } public Query setTimeout(int timeout) { selection.setTimeout( new Integer(timeout) ); return this; } public Query setFetchSize(int fetchSize) { selection.setFetchSize( new Integer(fetchSize) ); return this; } public Query setFirstResult(int firstResult) { selection.setFirstRow( new Integer(firstResult) ); return this; } public Query setParameter(int position, Object val, Type type) { if ( positionalParameterCount==0 ) { throw new IllegalArgumentException("No positional parameters in query: " + getQueryString() ); } if ( position<0 || position>positionalParameterCount-1 ) { throw new IllegalArgumentException("Positional parameter does not exist: " + position + " in query: " + getQueryString() ); } int size = values.size(); if ( position<size ) { values.set(position, val); types.set(position, type); } else { // prepend value and type list with null for any positions before the wanted position. for ( int i=0; i<position-size; i++ ) { values.add(UNSET_PARAMETER); types.add(UNSET_TYPE); } values.add(val); types.add(type); } return this; } public Query setString(int position, String val) { setParameter(position, val, Hibernate.STRING); return this; } public Query setCharacter(int position, char val) { setParameter(position, new Character(val), Hibernate.CHARACTER); return this; } public Query setBoolean(int position, boolean val) { setParameter(position, val ? Boolean.TRUE : Boolean.FALSE, Hibernate.BOOLEAN); return this; } public Query setByte(int position, byte val) { setParameter(position, new Byte(val), Hibernate.BYTE); return this; } public Query setShort(int position, short val) { setParameter(position, new Short(val), Hibernate.SHORT); return this; } public Query setInteger(int position, int val) { setParameter(position, new Integer(val), Hibernate.INTEGER); return this; } public Query setLong(int position, long val) { setParameter(position, new Long(val), Hibernate.LONG); return this; } public Query setFloat(int position, float val) { setParameter(position, new Float(val), Hibernate.FLOAT); return this; } public Query setDouble(int position, double val) { setParameter(position, new Double(val), Hibernate.DOUBLE); return this; } public Query setBinary(int position, byte[] val) { setParameter(position, val, Hibernate.BINARY); return this; } public Query setText(int position, String val) { setParameter(position, val, Hibernate.TEXT); return this; } public Query setSerializable(int position, Serializable val) { setParameter(position, val, Hibernate.SERIALIZABLE); return this; } public Query setDate(int position, Date date) { setParameter(position, date, Hibernate.DATE); return this; } public Query setTime(int position, Date date) { setParameter(position, date, Hibernate.TIME); return this; } public Query setTimestamp(int position, Date date) { setParameter(position, date, Hibernate.TIMESTAMP); return this; } public Query setEntity(int position, Object val) { setParameter( position, val, Hibernate.entity( session.bestGuessEntityName(val) ) ); return this; } public Query setLocale(int position, Locale locale) { setParameter(position, locale, Hibernate.LOCALE); return this; } public Query setCalendar(int position, Calendar calendar) { setParameter(position, calendar, Hibernate.CALENDAR); return this; } public Query setCalendarDate(int position, Calendar calendar) { setParameter(position, calendar, Hibernate.CALENDAR_DATE); return this; } public Query setBinary(String name, byte[] val) { setParameter(name, val, Hibernate.BINARY); return this; } public Query setText(String name, String val) { setParameter(name, val, Hibernate.TEXT); return this; } public Query setBoolean(String name, boolean val) { setParameter(name, val ? Boolean.TRUE : Boolean.FALSE, Hibernate.BOOLEAN); return this; } public Query setByte(String name, byte val) { setParameter(name, new Byte(val), Hibernate.BYTE); return this; } public Query setCharacter(String name, char val) { setParameter(name, new Character(val), Hibernate.CHARACTER); return this; } public Query setDate(String name, Date date) { setParameter(name, date, Hibernate.DATE); return this; } public Query setDouble(String name, double val) { setParameter(name, new Double(val), Hibernate.DOUBLE); return this; } public Query setEntity(String name, Object val) { setParameter( name, val, Hibernate.entity( session.bestGuessEntityName(val) ) ); return this; } public Query setFloat(String name, float val) { setParameter(name, new Float(val), Hibernate.FLOAT); return this; } public Query setInteger(String name, int val) { setParameter(name, new Integer(val), Hibernate.INTEGER); return this; } public Query setLocale(String name, Locale locale) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -