}

         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语句。

相关文章:

  • 2022-12-23
  • 2021-11-19
  • 2022-03-07
  • 2021-05-24
  • 2021-10-27
  • 2021-06-11
猜你喜欢
  • 2021-06-19
  • 2021-08-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-15
相关资源
相似解决方案