for (int j=0;j<results.Count;j++) {
currentResults.Add( results[j] );
}
results = currentResults;
}
}
finally {
dontFlushFromFind--;
}
return results;
}
根据HQL查询文本生成QueryTranslator对象,然后调用QueryTranslator的FindList方法返回查询结果。
//*** QueryTranslator.cs 1051行 ***
public IList FindList( ISessionImplementor session, object[] values, IType[] types,
bool returnProxies, RowSelection selection, IDictionary namedParams, IDictionary lockModes) {
return base.Find(session, values, types, returnProxies, selection, namedParams, lockModes);
}
FindList直接调用父类Loader的Find方法来查询数据,所有的数据加载(当然包括Criteria加载)最终都由Loader进行处理,关于这个类,将在后续的文章中单独进行分析。
//*** SessionImpl.cs 1616行***
private QueryTranslator[] GetQueries(string query, bool scalar) {
// a query that naemes an interface or unmapped class in the from clause
// is actually executed as multiple queries
string[] concreteQueries = QueryTranslator.ConcreteQueries(query, factory);
// take the union of the query spaces (ie the queried tables)
QueryTranslator[] q = new QueryTranslator[concreteQueries.Length];
ArrayList qs = new ArrayList();
for (int i=0; i<concreteQueries.Length; i++ ) {
q[i] = scalar ? factory.GetShallowQuery( concreteQueries[i] )
: factory.GetQuery( concreteQueries[i] );
qs.AddRange( q[i].QuerySpaces );
}
return q;
}
分析HQL查询文本,如果是由多个SQL语句组成,就要将其进行分割,最后由会话工厂根据HQL文本创建QueryTranslator对象。
//*** SessionFactoryImpl.cs 429行 ***
private QueryTranslator GetQuery(string query, bool shallow)
{
QueryCacheKey cacheKey = new QueryCacheKey(query, shallow);
QueryTranslator q = (QueryTranslator) Get(cacheKey);
if ( q==null) {
q = new QueryTranslator(dialect);
Put(cacheKey, q);
}
q.Compile(this, query, querySubstitutions, shallow);
return q;
}
检查在缓存中是否已存在相同的QueryTranslator对象,如没有,则创建一个并将其放入缓存,
然后调用QueryTranslator的Compile方法对HQL查询文本进行解析, 有关解析SQL的细节,请参考解析HQL语句。