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; } }; }