hibernate--sqlquery实现类,看看addentity等等方法内部实现

1.hibernate几个相关的实现类都在hibernate.core.x.x.xx.final.jar下的internal包里。

2.SQLQueryImpl类

  1 package org.hibernate.internal;
  2 
  3 import java.io.Serializable;
  4 import java.util.ArrayList;
  5 import java.util.Arrays;
  6 import java.util.Collection;
  7 import java.util.HashMap;
  8 import java.util.Iterator;
  9 import java.util.List;
 10 import java.util.Map;
 11 import org.hibernate.HibernateException;
 12 import org.hibernate.LockMode;
 13 import org.hibernate.LockOptions;
 14 import org.hibernate.MappingException;
 15 import org.hibernate.Query;
 16 import org.hibernate.QueryException;
 17 import org.hibernate.SQLQuery;
 18 import org.hibernate.SQLQuery.FetchReturn;
 19 import org.hibernate.SQLQuery.ReturnProperty;
 20 import org.hibernate.SQLQuery.RootReturn;
 21 import org.hibernate.ScrollMode;
 22 import org.hibernate.ScrollableResults;
 23 import org.hibernate.dialect.Dialect;
 24 import org.hibernate.engine.ResultSetMappingDefinition;
 25 import org.hibernate.engine.query.spi.ParameterMetadata;
 26 import org.hibernate.engine.query.spi.sql.NativeSQLQueryConstructorReturn;
 27 import org.hibernate.engine.query.spi.sql.NativeSQLQueryJoinReturn;
 28 import org.hibernate.engine.query.spi.sql.NativeSQLQueryReturn;
 29 import org.hibernate.engine.query.spi.sql.NativeSQLQueryRootReturn;
 30 import org.hibernate.engine.query.spi.sql.NativeSQLQueryScalarReturn;
 31 import org.hibernate.engine.query.spi.sql.NativeSQLQuerySpecification;
 32 import org.hibernate.engine.spi.NamedSQLQueryDefinition;
 33 import org.hibernate.engine.spi.QueryParameters;
 34 import org.hibernate.engine.spi.SessionFactoryImplementor;
 35 import org.hibernate.engine.spi.SessionImplementor;
 36 import org.hibernate.internal.util.StringHelper;
 37 import org.hibernate.persister.entity.EntityPersister;
 38 import org.hibernate.type.Type;
 39 
 40 public class SQLQueryImpl extends AbstractQueryImpl
 41   implements SQLQuery
 42 {
 43   private List<NativeSQLQueryReturn> queryReturns;
 44   private List<ReturnBuilder> queryReturnBuilders;
 45   private boolean autoDiscoverTypes;
 46   private Collection<String> querySpaces;
 47   private final boolean callable;
 48   private final LockOptions lockOptions = new LockOptions();
 49 
 50   SQLQueryImpl(NamedSQLQueryDefinition queryDef, SessionImplementor session, ParameterMetadata parameterMetadata)
 51   {
 52     super(queryDef.getQueryString(), queryDef.getFlushMode(), session, parameterMetadata);
 53     if (queryDef.getResultSetRef() != null) {
 54       ResultSetMappingDefinition definition = session.getFactory().getResultSetMapping(queryDef.getResultSetRef());
 55 
 56       if (definition == null) {
 57         throw new MappingException("Unable to find resultset-ref definition: " + queryDef.getResultSetRef());
 58       }
 59 
 60       this.queryReturns = new ArrayList(Arrays.asList(definition.getQueryReturns()));
 61     }
 62     else if ((queryDef.getQueryReturns() != null) && (queryDef.getQueryReturns().length > 0)) {
 63       this.queryReturns = new ArrayList(Arrays.asList(queryDef.getQueryReturns()));
 64     }
 65     else {
 66       this.queryReturns = new ArrayList();
 67     }
 68 
 69     this.querySpaces = queryDef.getQuerySpaces();
 70     this.callable = queryDef.isCallable();
 71   }
 72 
 73   SQLQueryImpl(String sql, SessionImplementor session, ParameterMetadata parameterMetadata) {
 74     this(sql, false, session, parameterMetadata);
 75   }
 76 
 77   SQLQueryImpl(String sql, boolean callable, SessionImplementor session, ParameterMetadata parameterMetadata) {
 78     super(sql, null, session, parameterMetadata);
 79     this.queryReturns = new ArrayList();
 80     this.querySpaces = null;
 81     this.callable = callable;
 82   }
 83 
 84   public List<NativeSQLQueryReturn> getQueryReturns()
 85   {
 86     prepareQueryReturnsIfNecessary();
 87     return this.queryReturns;
 88   }
 89 
 90   public Collection<String> getSynchronizedQuerySpaces()
 91   {
 92     return this.querySpaces;
 93   }
 94 
 95   public boolean isCallable()
 96   {
 97     return this.callable;
 98   }
 99 
100   public List list() throws HibernateException
101   {
102     verifyParameters();
103     before();
104 
105     Map namedParams = getNamedParams();
106     NativeSQLQuerySpecification spec = generateQuerySpecification(namedParams);
107     try
108     {
109       return getSession().list(spec, getQueryParameters(namedParams));
110     }
111     finally {
112       after();
113     }
114   }
115 
116   private NativeSQLQuerySpecification generateQuerySpecification(Map namedParams) {
117     return new NativeSQLQuerySpecification(expandParameterLists(namedParams), (NativeSQLQueryReturn[])this.queryReturns.toArray(new NativeSQLQueryReturn[this.queryReturns.size()]), this.querySpaces);
118   }
119 
120   public ScrollableResults scroll(ScrollMode scrollMode)
121     throws HibernateException
122   {
123     verifyParameters();
124     before();
125 
126     Map namedParams = getNamedParams();
127     NativeSQLQuerySpecification spec = generateQuerySpecification(namedParams);
128 
129     QueryParameters qp = getQueryParameters(namedParams);
130     qp.setScrollMode(scrollMode);
131     try
132     {
133       return getSession().scroll(spec, qp);
134     }
135     finally {
136       after();
137     }
138   }
139 
140   public ScrollableResults scroll() throws HibernateException {
141     return scroll(this.session.getFactory().getDialect().defaultScrollMode());
142   }
143 
144   public Iterator iterate() throws HibernateException {
145     throw new UnsupportedOperationException("SQL queries do not currently support iteration");
146   }
147 
148   public QueryParameters getQueryParameters(Map namedParams)
149   {
150     QueryParameters qp = super.getQueryParameters(namedParams);
151     qp.setCallable(this.callable);
152     qp.setAutoDiscoverScalarTypes(this.autoDiscoverTypes);
153     return qp;
154   }
155 
156   protected void verifyParameters()
157   {
158     prepareQueryReturnsIfNecessary();
159     verifyParameters(this.callable);
160     boolean noReturns = (this.queryReturns == null) || (this.queryReturns.isEmpty());
161     if (noReturns) {
162       this.autoDiscoverTypes = noReturns;
163     }
164     else
165       for (NativeSQLQueryReturn queryReturn : this.queryReturns)
166         if ((queryReturn instanceof NativeSQLQueryScalarReturn)) {
167           NativeSQLQueryScalarReturn scalar = (NativeSQLQueryScalarReturn)queryReturn;
168           if (scalar.getType() == null) {
169             this.autoDiscoverTypes = true;
170             break;
171           }
172         }
173         else if (NativeSQLQueryConstructorReturn.class.isInstance(queryReturn)) {
174           this.autoDiscoverTypes = true;
175           break;
176         }
177   }
178 
179   private void prepareQueryReturnsIfNecessary()
180   {
181     if (this.queryReturnBuilders != null) {
182       if (!this.queryReturnBuilders.isEmpty()) {
183         if (this.queryReturns != null) {
184           this.queryReturns.clear();
185           this.queryReturns = null;
186         }
187         this.queryReturns = new ArrayList();
188         for (ReturnBuilder builder : this.queryReturnBuilders) {
189           this.queryReturns.add(builder.buildReturn());
190         }
191         this.queryReturnBuilders.clear();
192       }
193       this.queryReturnBuilders = null;
194     }
195   }
196 
197   public String[] getReturnAliases() throws HibernateException
198   {
199     throw new UnsupportedOperationException("SQL queries do not currently support returning aliases");
200   }
201 
202   public Type[] getReturnTypes() throws HibernateException
203   {
204     throw new UnsupportedOperationException("not yet implemented for SQL queries");
205   }
206 
207   public Query setLockMode(String alias, LockMode lockMode) {
208     throw new UnsupportedOperationException("cannot set the lock mode for a native SQL query");
209   }
210 
211   public Query setLockOptions(LockOptions lockOptions) {
212     throw new UnsupportedOperationException("cannot set lock options for a native SQL query");
213   }
214 
215   public LockOptions getLockOptions()
216   {
217     return this.lockOptions;
218   }
219 
220   public SQLQuery addScalar(final String columnAlias, final Type type) {
221     if (this.queryReturnBuilders == null) {
222       this.queryReturnBuilders = new ArrayList();
223     }
224     this.queryReturnBuilders.add(new ReturnBuilder()
225     {
226       public NativeSQLQueryReturn buildReturn() {
227         return new NativeSQLQueryScalarReturn(columnAlias, type);
228       }
229     });
230     return this;
231   }
232 
233   public SQLQuery addScalar(String columnAlias) {
234     return addScalar(columnAlias, null);
235   }
236 
237   public SQLQuery.RootReturn addRoot(String tableAlias, String entityName) {
238     RootReturnBuilder builder = new RootReturnBuilder(tableAlias, entityName, null);
239     if (this.queryReturnBuilders == null) {
240       this.queryReturnBuilders = new ArrayList();
241     }
242     this.queryReturnBuilders.add(builder);
243     return builder;
244   }
245 
246   public SQLQuery.RootReturn addRoot(String tableAlias, Class entityType) {
247     return addRoot(tableAlias, entityType.getName());
248   }
249 
250   public SQLQuery addEntity(String entityName) {
251     return addEntity(StringHelper.unqualify(entityName), entityName);////////////////////////////////////////////////////////相关到internal包下的util包下的StringHelper.class类
252   }
253 
254   public SQLQuery addEntity(String alias, String entityName) {
255     addRoot(alias, entityName);
256     return this;
257   }
258 
259   public SQLQuery addEntity(String alias, String entityName, LockMode lockMode) {
260     addRoot(alias, entityName).setLockMode(lockMode);
261     return this;
262   }
263 
264   public SQLQuery addEntity(Class entityType) {
265     return addEntity(entityType.getName());
266   }
267 
268   public SQLQuery addEntity(String alias, Class entityClass) {
269     return addEntity(alias, entityClass.getName());
270   }
271 
272   public SQLQuery addEntity(String alias, Class entityClass, LockMode lockMode) {
273     return addEntity(alias, entityClass.getName(), lockMode);
274   }
275 
276   public SQLQuery.FetchReturn addFetch(String tableAlias, String ownerTableAlias, String joinPropertyName) {
277     FetchReturnBuilder builder = new FetchReturnBuilder(tableAlias, ownerTableAlias, joinPropertyName, null);
278     if (this.queryReturnBuilders == null) {
279       this.queryReturnBuilders = new ArrayList();
280     }
281     this.queryReturnBuilders.add(builder);
282     return builder;
283   }
284 
285   public SQLQuery addJoin(String tableAlias, String ownerTableAlias, String joinPropertyName) {
286     addFetch(tableAlias, ownerTableAlias, joinPropertyName);
287     return this;
288   }
289 
290   public SQLQuery addJoin(String alias, String path) {
291     createFetchJoin(alias, path);
292     return this;
293   }
294 
295   private SQLQuery.FetchReturn createFetchJoin(String tableAlias, String path) {
296     int loc = path.indexOf('.');
297     if (loc < 0) {
298       throw new QueryException("not a property path: " + path);
299     }
300     String ownerTableAlias = path.substring(0, loc);
301     String joinedPropertyName = path.substring(loc + 1);
302     return addFetch(tableAlias, ownerTableAlias, joinedPropertyName);
303   }
304 
305   public SQLQuery addJoin(String alias, String path, LockMode lockMode) {
306     createFetchJoin(alias, path).setLockMode(lockMode);
307     return this;
308   }
309 
310   public SQLQuery setResultSetMapping(String name) {
311     ResultSetMappingDefinition mapping = this.session.getFactory().getResultSetMapping(name);
312     if (mapping == null) {
313       throw new MappingException("Unknown SqlResultSetMapping [" + name + "]");
314     }
315     NativeSQLQueryReturn[] returns = mapping.getQueryReturns();
316     this.queryReturns.addAll(Arrays.asList(returns));
317     return this;
318   }
319 
320   public SQLQuery addSynchronizedQuerySpace(String querySpace) {
321     if (this.querySpaces == null) {
322       this.querySpaces = new ArrayList();
323     }
324     this.querySpaces.add(querySpace);
325     return this;
326   }
327 
328   public SQLQuery addSynchronizedEntityName(String entityName) {
329     return addQuerySpaces(getSession().getFactory().getEntityPersister(entityName).getQuerySpaces());
330   }
331 
332   public SQLQuery addSynchronizedEntityClass(Class entityClass) {
333     return addQuerySpaces(getSession().getFactory().getEntityPersister(entityClass.getName()).getQuerySpaces());
334   }
335 
336   private SQLQuery addQuerySpaces(Serializable[] spaces) {
337     if (spaces != null) {
338       if (this.querySpaces == null) {
339         this.querySpaces = new ArrayList();
340       }
341       this.querySpaces.addAll(Arrays.asList((String[])spaces));
342     }
343     return this;
344   }
345 
346   public int executeUpdate() throws HibernateException {
347     Map namedParams = getNamedParams();
348     before();
349     try {
350       return getSession().executeNativeUpdate(generateQuerySpecification(namedParams), getQueryParameters(namedParams));
351     }
352     finally
353     {
354       after();
355     }
356   }
357 
358   private static abstract interface ReturnBuilder
359   {
360     public abstract NativeSQLQueryReturn buildReturn();
361   }
362 
363   private class FetchReturnBuilder
364     implements SQLQuery.FetchReturn, SQLQueryImpl.ReturnBuilder
365   {
366     private final String alias;
367     private String ownerTableAlias;
368     private final String joinedPropertyName;
369     private LockMode lockMode = LockMode.READ;
370     private Map<String, String[]> propertyMappings;
371 
372     private FetchReturnBuilder(String alias, String ownerTableAlias, String joinedPropertyName)
373     {
374       this.alias = alias;
375       this.ownerTableAlias = ownerTableAlias;
376       this.joinedPropertyName = joinedPropertyName;
377     }
378 
379     public SQLQuery.FetchReturn setLockMode(LockMode lockMode) {
380       this.lockMode = lockMode;
381       return this;
382     }
383 
384     public SQLQuery.FetchReturn addProperty(String propertyName, String columnAlias) {
385       addProperty(propertyName).addColumnAlias(columnAlias);
386       return this;
387     }
388 
389     public SQLQuery.ReturnProperty addProperty(final String propertyName) {
390       if (this.propertyMappings == null) {
391         this.propertyMappings = new HashMap();
392       }
393       return new SQLQuery.ReturnProperty() {
394         public SQLQuery.ReturnProperty addColumnAlias(String columnAlias) {
395           String[] columnAliases = (String[])SQLQueryImpl.FetchReturnBuilder.this.propertyMappings.get(propertyName);
396           if (columnAliases == null) {
397             columnAliases = new String[] { columnAlias };
398           } else {
399             String[] newColumnAliases = new String[columnAliases.length + 1];
400             System.arraycopy(columnAliases, 0, newColumnAliases, 0, columnAliases.length);
401             newColumnAliases[columnAliases.length] = columnAlias;
402             columnAliases = newColumnAliases;
403           }
404           SQLQueryImpl.FetchReturnBuilder.this.propertyMappings.put(propertyName, columnAliases);
405           return this;
406         }
407       };
408     }
409 
410     public NativeSQLQueryReturn buildReturn() {
411       return new NativeSQLQueryJoinReturn(this.alias, this.ownerTableAlias, this.joinedPropertyName, this.propertyMappings, this.lockMode);
412     }
413   }
414 
415   private class RootReturnBuilder
416     implements SQLQuery.RootReturn, SQLQueryImpl.ReturnBuilder
417   {
418     private final String alias;
419     private final String entityName;
420     private LockMode lockMode = LockMode.READ;
421     private Map<String, String[]> propertyMappings;
422 
423     private RootReturnBuilder(String alias, String entityName)
424     {
425       this.alias = alias;
426       this.entityName = entityName;
427     }
428 
429     public SQLQuery.RootReturn setLockMode(LockMode lockMode) {
430       this.lockMode = lockMode;
431       return this;
432     }
433 
434     public SQLQuery.RootReturn setDiscriminatorAlias(String alias) {
435       addProperty("class", alias);
436       return this;
437     }
438 
439     public SQLQuery.RootReturn addProperty(String propertyName, String columnAlias) {
440       addProperty(propertyName).addColumnAlias(columnAlias);
441       return this;
442     }
443 
444     public SQLQuery.ReturnProperty addProperty(final String propertyName) {
445       if (this.propertyMappings == null) {
446         this.propertyMappings = new HashMap();
447       }
448       return new SQLQuery.ReturnProperty() {
449         public SQLQuery.ReturnProperty addColumnAlias(String columnAlias) {
450           String[] columnAliases = (String[])SQLQueryImpl.RootReturnBuilder.this.propertyMappings.get(propertyName);
451           if (columnAliases == null) {
452             columnAliases = new String[] { columnAlias };
453           } else {
454             String[] newColumnAliases = new String[columnAliases.length + 1];
455             System.arraycopy(columnAliases, 0, newColumnAliases, 0, columnAliases.length);
456             newColumnAliases[columnAliases.length] = columnAlias;
457             columnAliases = newColumnAliases;
458           }
459           SQLQueryImpl.RootReturnBuilder.this.propertyMappings.put(propertyName, columnAliases);
460           return this;
461         }
462       };
463     }
464 
465     public NativeSQLQueryReturn buildReturn() {
466       return new NativeSQLQueryRootReturn(this.alias, this.entityName, this.propertyMappings, this.lockMode);
467     }
468   }
469 }

3.StringHelper.class

  1 package org.hibernate.internal.util;
  2 
  3 import java.io.Serializable;
  4 import java.util.ArrayList;
  5 import java.util.Arrays;
  6 import java.util.BitSet;
  7 import java.util.Iterator;
  8 import java.util.Locale;
  9 import java.util.StringTokenizer;
 10 import org.hibernate.dialect.Dialect;
 11 import org.hibernate.internal.util.collections.ArrayHelper;
 12 
 13 public final class StringHelper
 14 {
 15   private static final int ALIAS_TRUNCATE_LENGTH = 10;
 16   public static final String WHITESPACE = " \n\r\f\t";
 17   public static final String BATCH_ID_PLACEHOLDER = "$$BATCH_ID_PLACEHOLDER$$";
 18 
 19   public static int lastIndexOfLetter(String string)
 20   {
 21     for (int i = 0; i < string.length(); i++) {
 22       char character = string.charAt(i);
 23 
 24       if ((!Character.isLetter(character)) && ('_' != character)) return i - 1;
 25     }
 26     return string.length() - 1;
 27   }
 28 
 29   public static String join(String seperator, String[] strings) {
 30     int length = strings.length;
 31     if (length == 0) return "";
 32     StringBuilder buf = new StringBuilder(length * strings[0].length()).append(strings[0]);
 33 
 34     for (int i = 1; i < length; i++) {
 35       buf.append(seperator).append(strings[i]);
 36     }
 37     return buf.toString();
 38   }
 39 
 40   public static String joinWithQualifierAndSuffix(String[] values, String qualifier, String suffix, String deliminator) {
 41     int length = values.length;
 42     if (length == 0) return "";
 43     StringBuilder buf = new StringBuilder(length * (values[0].length() + suffix.length())).append(qualify(qualifier, values[0])).append(suffix);
 44 
 45     for (int i = 1; i < length; i++) {
 46       buf.append(deliminator).append(qualify(qualifier, values[i])).append(suffix);
 47     }
 48     return buf.toString();
 49   }
 50 
 51   public static String join(String seperator, Iterator objects) {
 52     StringBuilder buf = new StringBuilder();
 53     if (objects.hasNext()) buf.append(objects.next());
 54     while (objects.hasNext()) {
 55       buf.append(seperator).append(objects.next());
 56     }
 57     return buf.toString();
 58   }
 59 
 60   public static String[] add(String[] x, String sep, String[] y) {
 61     String[] result = new String[x.length];
 62     for (int i = 0; i < x.length; i++) {
 63       result[i] = new StringBuilder().append(x[i]).append(sep).append(y[i]).toString();
 64     }
 65     return result;
 66   }
 67 
 68   public static String repeat(String string, int times) {
 69     StringBuilder buf = new StringBuilder(string.length() * times);
 70     for (int i = 0; i < times; i++) buf.append(string);
 71     return buf.toString();
 72   }
 73 
 74   public static String repeat(String string, int times, String deliminator) {
 75     StringBuilder buf = new StringBuilder(string.length() * times + deliminator.length() * (times - 1)).append(string);
 76 
 77     for (int i = 1; i < times; i++) {
 78       buf.append(deliminator).append(string);
 79     }
 80     return buf.toString();
 81   }
 82 
 83   public static String repeat(char character, int times) {
 84     char[] buffer = new char[times];
 85     Arrays.fill(buffer, character);
 86     return new String(buffer);
 87   }
 88 
 89   public static String replace(String template, String placeholder, String replacement)
 90   {
 91     return replace(template, placeholder, replacement, false);
 92   }
 93 
 94   public static String[] replace(String[] templates, String placeholder, String replacement) {
 95     String[] result = new String[templates.length];
 96     for (int i = 0; i < templates.length; i++) {
 97       result[i] = replace(templates[i], placeholder, replacement);
 98     }
 99     return result;
100   }
101 
102   public static String replace(String template, String placeholder, String replacement, boolean wholeWords) {
103     return replace(template, placeholder, replacement, wholeWords, false);
104   }
105 
106   public static String replace(String template, String placeholder, String replacement, boolean wholeWords, boolean encloseInParensIfNecessary)
107   {
108     if (template == null) {
109       return template;
110     }
111     int loc = template.indexOf(placeholder);
112     if (loc < 0) {
113       return template;
114     }
115 
116     String beforePlaceholder = template.substring(0, loc);
117     String afterPlaceholder = template.substring(loc + placeholder.length());
118     return replace(beforePlaceholder, afterPlaceholder, placeholder, replacement, wholeWords, encloseInParensIfNecessary);
119   }
120 
121   public static String replace(String beforePlaceholder, String afterPlaceholder, String placeholder, String replacement, boolean wholeWords, boolean encloseInParensIfNecessary)
122   {
123     boolean actuallyReplace = (!wholeWords) || (afterPlaceholder.length() == 0) || (!Character.isJavaIdentifierPart(afterPlaceholder.charAt(0)));
124 
125     boolean encloseInParens = (actuallyReplace) && (encloseInParensIfNecessary) && (getLastNonWhitespaceCharacter(beforePlaceholder) != '(') && (getFirstNonWhitespaceCharacter(afterPlaceholder) != ')');
126 
127     StringBuilder buf = new StringBuilder(beforePlaceholder);
128     if (encloseInParens) {
129       buf.append('(');
130     }
131     buf.append(actuallyReplace ? replacement : placeholder);
132     if (encloseInParens) {
133       buf.append(')');
134     }
135     buf.append(replace(afterPlaceholder, placeholder, replacement, wholeWords, encloseInParensIfNecessary));
136 
137     return buf.toString();
138   }
139 
140   public static char getLastNonWhitespaceCharacter(String str) {
141     if ((str != null) && (str.length() > 0)) {
142       for (int i = str.length() - 1; i >= 0; i--) {
143         char ch = str.charAt(i);
144         if (!Character.isWhitespace(ch)) {
145           return ch;
146         }
147       }
148     }
149     return '\000';
150   }
151 
152   public static char getFirstNonWhitespaceCharacter(String str) {
153     if ((str != null) && (str.length() > 0)) {
154       for (int i = 0; i < str.length(); i++) {
155         char ch = str.charAt(i);
156         if (!Character.isWhitespace(ch)) {
157           return ch;
158         }
159       }
160     }
161     return '\000';
162   }
163 
164   public static String replaceOnce(String template, String placeholder, String replacement) {
165     if (template == null) {
166       return template;
167     }
168     int loc = template.indexOf(placeholder);
169     if (loc < 0) {
170       return template;
171     }
172 
173     return new StringBuilder(template.substring(0, loc)).append(replacement).append(template.substring(loc + placeholder.length())).toString();
174   }
175 
176   public static String[] split(String seperators, String list)
177   {
178     return split(seperators, list, false);
179   }
180 
181   public static String[] split(String seperators, String list, boolean include) {
182     StringTokenizer tokens = new StringTokenizer(list, seperators, include);
183     String[] result = new String[tokens.countTokens()];
184     int i = 0;
185     while (tokens.hasMoreTokens()) {
186       result[(i++)] = tokens.nextToken();
187     }
188     return result;
189   }
190 
191   public static String unqualify(String qualifiedName) {
192     int loc = qualifiedName.lastIndexOf(".");
193     return loc < 0 ? qualifiedName : qualifiedName.substring(loc + 1);
194   }
195 
196   public static String qualifier(String qualifiedName) {
197     int loc = qualifiedName.lastIndexOf(".");
198     return loc < 0 ? "" : qualifiedName.substring(0, loc);
199   }
200 
201   public static String collapse(String name)
202   {
203     if (name == null) {
204       return null;
205     }
206     int breakPoint = name.lastIndexOf(46);
207     if (breakPoint < 0) {
208       return name;
209     }
210     return new StringBuilder().append(collapseQualifier(name.substring(0, breakPoint), true)).append(name.substring(breakPoint)).toString();
211   }
212 
213   public static String collapseQualifier(String qualifier, boolean includeDots)
214   {
215     StringTokenizer tokenizer = new StringTokenizer(qualifier, ".");
216     String collapsed = Character.toString(tokenizer.nextToken().charAt(0));
217     while (tokenizer.hasMoreTokens()) {
218       if (includeDots) {
219         collapsed = new StringBuilder().append(collapsed).append('.').toString();
220       }
221       collapsed = new StringBuilder().append(collapsed).append(tokenizer.nextToken().charAt(0)).toString();
222     }
223     return collapsed;
224   }
225 
226   public static String partiallyUnqualify(String name, String qualifierBase)
227   {
228     if ((name == null) || (!name.startsWith(qualifierBase))) {
229       return name;
230     }
231     return name.substring(qualifierBase.length() + 1);
232   }
233 
234   public static String collapseQualifierBase(String name, String qualifierBase)
235   {
236     if ((name == null) || (!name.startsWith(qualifierBase))) {
237       return collapse(name);
238     }
239     return new StringBuilder().append(collapseQualifier(qualifierBase, true)).append(name.substring(qualifierBase.length())).toString();
240   }
241 
242   public static String[] suffix(String[] columns, String suffix) {
243     if (suffix == null) return columns;
244     String[] qualified = new String[columns.length];
245     for (int i = 0; i < columns.length; i++) {
246       qualified[i] = suffix(columns[i], suffix);
247     }
248     return qualified;
249   }
250 
251   private static String suffix(String name, String suffix) {
252     return suffix == null ? name : new StringBuilder().append(name).append(suffix).toString();
253   }
254 
255   public static String root(String qualifiedName) {
256     int loc = qualifiedName.indexOf(".");
257     return loc < 0 ? qualifiedName : qualifiedName.substring(0, loc);
258   }
259 
260   public static String unroot(String qualifiedName) {
261     int loc = qualifiedName.indexOf(".");
262     return loc < 0 ? qualifiedName : qualifiedName.substring(loc + 1, qualifiedName.length());
263   }
264 
265   public static boolean booleanValue(String tfString) {
266     String trimmed = tfString.trim().toLowerCase(Locale.ROOT);
267     return (trimmed.equals("true")) || (trimmed.equals("t"));
268   }
269 
270   public static String toString(Object[] array) {
271     int len = array.length;
272     if (len == 0) return "";
273     StringBuilder buf = new StringBuilder(len * 12);
274     for (int i = 0; i < len - 1; i++) {
275       buf.append(array[i]).append(", ");
276     }
277     return buf.append(array[(len - 1)]).toString();
278   }
279 
280   public static String[] multiply(String string, Iterator placeholders, Iterator replacements) {
281     String[] result = { string };
282     while (placeholders.hasNext()) {
283       result = multiply(result, (String)placeholders.next(), (String[])replacements.next());
284     }
285     return result;
286   }
287 
288   private static String[] multiply(String[] strings, String placeholder, String[] replacements) {
289     String[] results = new String[replacements.length * strings.length];
290     int n = 0;
291     for (int i = 0; i < replacements.length; i++) {
292       for (int j = 0; j < strings.length; j++) {
293         results[(n++)] = replaceOnce(strings[j], placeholder, replacements[i]);
294       }
295     }
296     return results;
297   }
298 
299   public static int countUnquoted(String string, char character) {
300     if ('\'' == character) {
301       throw new IllegalArgumentException("Unquoted count of quotes is invalid");
302     }
303     if (string == null) {
304       return 0;
305     }
306 
307     int count = 0;
308     int stringLength = string.length();
309     boolean inQuote = false;
310     for (int indx = 0; indx < stringLength; indx++) {
311       char c = string.charAt(indx);
312       if (inQuote) {
313         if ('\'' == c) {
314           inQuote = false;
315         }
316       }
317       else if ('\'' == c) {
318         inQuote = true;
319       }
320       else if (c == character) {
321         count++;
322       }
323     }
324     return count;
325   }
326 
327   public static int[] locateUnquoted(String string, char character) {
328     if ('\'' == character) {
329       throw new IllegalArgumentException("Unquoted count of quotes is invalid");
330     }
331     if (string == null) {
332       return new int[0];
333     }
334 
335     ArrayList locations = new ArrayList(20);
336 
337     int stringLength = string.length();
338     boolean inQuote = false;
339     for (int indx = 0; indx < stringLength; indx++) {
340       char c = string.charAt(indx);
341       if (inQuote) {
342         if ('\'' == c) {
343           inQuote = false;
344         }
345       }
346       else if ('\'' == c) {
347         inQuote = true;
348       }
349       else if (c == character) {
350         locations.add(Integer.valueOf(indx));
351       }
352     }
353     return ArrayHelper.toIntArray(locations);
354   }
355 
356   public static boolean isNotEmpty(String string) {
357     return (string != null) && (string.length() > 0);
358   }
359 
360   public static boolean isEmpty(String string) {
361     return (string == null) || (string.length() == 0);
362   }
363 
364   public static String qualify(String prefix, String name) {
365     if ((name == null) || (prefix == null)) {
366       throw new NullPointerException("prefix or name were null attempting to build qualified name");
367     }
368     return new StringBuilder().append(prefix).append('.').append(name).toString();
369   }
370 
371   public static String[] qualify(String prefix, String[] names) {
372     if (prefix == null) {
373       return names;
374     }
375     int len = names.length;
376     String[] qualified = new String[len];
377     for (int i = 0; i < len; i++) {
378       qualified[i] = qualify(prefix, names[i]);
379     }
380     return qualified;
381   }
382 
383   public static String[] qualifyIfNot(String prefix, String[] names) {
384     if (prefix == null) {
385       return names;
386     }
387     int len = names.length;
388     String[] qualified = new String[len];
389     for (int i = 0; i < len; i++) {
390       if (names[i].indexOf(46) < 0) {
391         qualified[i] = qualify(prefix, names[i]);
392       }
393       else {
394         qualified[i] = names[i];
395       }
396     }
397     return qualified;
398   }
399 
400   public static int firstIndexOfChar(String sqlString, BitSet keys, int startindex) {
401     int i = startindex; for (int size = sqlString.length(); i < size; i++) {
402       if (keys.get(sqlString.charAt(i))) {
403         return i;
404       }
405     }
406     return -1;
407   }
408 
409   public static int firstIndexOfChar(String sqlString, String string, int startindex)
410   {
411     BitSet keys = new BitSet();
412     int i = 0; for (int size = string.length(); i < size; i++) {
413       keys.set(string.charAt(i));
414     }
415     return firstIndexOfChar(sqlString, keys, startindex);
416   }
417 
418   public static String truncate(String string, int length)
419   {
420     if (string.length() <= length) {
421       return string;
422     }
423 
424     return string.substring(0, length);
425   }
426 
427   public static String generateAlias(String description)
428   {
429     return new StringBuilder().append(generateAliasRoot(description)).append('_').toString();
430   }
431 
432   public static String generateAlias(String description, int unique)
433   {
434     return new StringBuilder().append(generateAliasRoot(description)).append(Integer.toString(unique)).append('_').toString();
435   }
436 
437   private static String generateAliasRoot(String description)
438   {
439     String result = truncate(unqualifyEntityName(description), 10).toLowerCase(Locale.ROOT).replace('/', '_').replace('$', '_');
440 
441     result = cleanAlias(result);
442     if (Character.isDigit(result.charAt(result.length() - 1))) {
443       return new StringBuilder().append(result).append("x").toString();
444     }
445 
446     return result;
447   }
448 
449   private static String cleanAlias(String alias)
450   {
451     char[] chars = alias.toCharArray();
452 
453     if (!Character.isLetter(chars[0])) {
454       for (int i = 1; i < chars.length; i++)
455       {
456         if (Character.isLetter(chars[i])) {
457           return alias.substring(i);
458         }
459       }
460     }
461     return alias;
462   }
463 
464   public static String unqualifyEntityName(String entityName) {
465     String result = unqualify(entityName);
466     int slashPos = result.indexOf(47);
467     if (slashPos > 0) {
468       result = result.substring(0, slashPos - 1);
469     }
470     return result;
471   }
472 
473   public static String moveAndToBeginning(String filter) {
474     if (filter.trim().length() > 0) {
475       filter = new StringBuilder().append(filter).append(" and ").toString();
476       if (filter.startsWith(" and ")) filter = filter.substring(4);
477     }
478     return filter;
479   }
480 
481   public static boolean isQuoted(String name)
482   {
483     return (name != null) && (name.length() != 0) && (((name.charAt(0) == '`') && (name.charAt(name.length() - 1) == '`')) || ((name.charAt(0) == '"') && (name.charAt(name.length() - 1) == '"')));
484   }
485 
486   public static String quote(String name)
487   {
488     if ((isEmpty(name)) || (isQuoted(name))) {
489       return name;
490     }
491 
492     if ((name.startsWith("\"")) && (name.endsWith("\""))) {
493       name = name.substring(1, name.length() - 1);
494     }
495 
496     return new StringBuilder(name.length() + 2).append('`').append(name).append('`').toString();
497   }
498 
499   public static String unquote(String name)
500   {
501     return isQuoted(name) ? name.substring(1, name.length() - 1) : name;
502   }
503 
504   public static boolean isQuoted(String name, Dialect dialect)
505   {
506     return (name != null) && (name.length() != 0) && (((name.charAt(0) == '`') && (name.charAt(name.length() - 1) == '`')) || ((name.charAt(0) == '"') && (name.charAt(name.length() - 1) == '"')) || ((name.charAt(0) == dialect.openQuote()) && (name.charAt(name.length() - 1) == dialect.closeQuote())));
507   }
508 
509   public static String unquote(String name, Dialect dialect)
510   {
511     return isQuoted(name, dialect) ? name.substring(1, name.length() - 1) : name;
512   }
513 
514   public static String[] unquote(String[] names, Dialect dialect)
515   {
516     if (names == null) {
517       return null;
518     }
519     String[] unquoted = new String[names.length];
520     for (int i = 0; i < names.length; i++) {
521       unquoted[i] = unquote(names[i], dialect);
522     }
523     return unquoted;
524   }
525 
526   public static StringBuilder buildBatchFetchRestrictionFragment(String alias, String[] columnNames, Dialect dialect)
527   {
528     if (columnNames.length == 1)
529     {
530       return new StringBuilder(qualify(alias, columnNames[0])).append(" in (").append("$$BATCH_ID_PLACEHOLDER$$").append(")");
531     }
532 
533     if (dialect.supportsRowValueConstructorSyntaxInInList())
534     {
535       StringBuilder builder = new StringBuilder();
536       builder.append("(");
537       boolean firstPass = true;
538       String deliminator = "";
539       for (String columnName : columnNames) {
540         builder.append(deliminator).append(qualify(alias, columnName));
541         if (firstPass) {
542           firstPass = false;
543           deliminator = ",";
544         }
545       }
546       builder.append(") in (");
547       builder.append("$$BATCH_ID_PLACEHOLDER$$");
548       builder.append(")");
549       return builder;
550     }
551 
552     return new StringBuilder("(").append("$$BATCH_ID_PLACEHOLDER$$").append(")");
553   }
554 
555   public static String expandBatchIdPlaceholder(String sql, Serializable[] ids, String alias, String[] keyColumnNames, Dialect dialect)
556   {
557     if (keyColumnNames.length == 1)
558     {
559       return replace(sql, "$$BATCH_ID_PLACEHOLDER$$", repeat("?", ids.length, ","));
560     }
561 
562     if (dialect.supportsRowValueConstructorSyntaxInInList()) {
563       String tuple = new StringBuilder().append("(").append(repeat("?", keyColumnNames.length, ",")).append(")").toString();
564       return replace(sql, "$$BATCH_ID_PLACEHOLDER$$", repeat(tuple, ids.length, ","));
565     }
566 
567     String keyCheck = new StringBuilder().append("(").append(joinWithQualifierAndSuffix(keyColumnNames, alias, " = ?", " and ")).append(")").toString();
568     return replace(sql, "$$BATCH_ID_PLACEHOLDER$$", repeat(keyCheck, ids.length, " or "));
569   }
570 
571   public static String[] toArrayElement(String s)
572   {
573     return new String[] { (s == null) || (s.length() == 0) ? new String[0] : s };
574   }
575 }

总结:

addentity最终调用的是addroot方法,StringHelper是帮助截取参数。总之最最后返回的是一个list(private List<ReturnBuilder> queryReturnBuilders;--在SqlQueryImpl类里的一个变量)

//addentity最终调用的一个
public SQLQuery addEntity(String alias, String entityName) {
    addRoot(alias, entityName);
    return this;
  }
//StringHelper帮助构造方法参数
 public static String unquote(String name)
  {
    return isQuoted(name) ? name.substring(1, name.length() - 1) : name;
  }

  public static boolean isQuoted(String name, Dialect dialect)
  {
    return (name != null) && (name.length() != 0) && (((name.charAt(0) == '`') && (name.charAt(name.length() - 1) == '`')) || ((name.charAt(0) == '"') && (name.charAt(name.length() - 1) == '"')) || ((name.charAt(0) == dialect.openQuote()) && (name.charAt(name.length() - 1) == dialect.closeQuote())));
  }
//都要调用addRoot方法
 public SQLQuery.RootReturn addRoot(String tableAlias, String entityName) {
    RootReturnBuilder builder = new RootReturnBuilder(tableAlias, entityName, null);
    if (this.queryReturnBuilders == null) {
      this.queryReturnBuilders = new ArrayList();
    }
    this.queryReturnBuilders.add(builder);
    return builder;
  }
//相关的内部类RootReturnBuilder
private class RootReturnBuilder
    implements SQLQuery.RootReturn, SQLQueryImpl.ReturnBuilder
  {
    private final String alias;
    private final String entityName;
    private LockMode lockMode = LockMode.READ;
    private Map<String, String[]> propertyMappings;

    private RootReturnBuilder(String alias, String entityName)
    {
      this.alias = alias;
      this.entityName = entityName;
    }

    public SQLQuery.RootReturn setLockMode(LockMode lockMode) {
      this.lockMode = lockMode;
      return this;
    }

    public SQLQuery.RootReturn setDiscriminatorAlias(String alias) {
      addProperty("class", alias);
      return this;
    }

    public SQLQuery.RootReturn addProperty(String propertyName, String columnAlias) {
      addProperty(propertyName).addColumnAlias(columnAlias);
      return this;
    }

    public SQLQuery.ReturnProperty addProperty(final String propertyName) {
      if (this.propertyMappings == null) {
        this.propertyMappings = new HashMap();
      }
      return new SQLQuery.ReturnProperty() {
        public SQLQuery.ReturnProperty addColumnAlias(String columnAlias) {
          String[] columnAliases = (String[])SQLQueryImpl.RootReturnBuilder.this.propertyMappings.get(propertyName);
          if (columnAliases == null) {
            columnAliases = new String[] { columnAlias };
          } else {
            String[] newColumnAliases = new String[columnAliases.length + 1];
            System.arraycopy(columnAliases, 0, newColumnAliases, 0, columnAliases.length);
            newColumnAliases[columnAliases.length] = columnAlias;
            columnAliases = newColumnAliases;
          }
          SQLQueryImpl.RootReturnBuilder.this.propertyMappings.put(propertyName, columnAliases);
          return this;
        }
      };
    }

 

posted @ 2017-04-21 13:14  Horsen  阅读(1796)  评论(0编辑  收藏  举报