public void InitializeInnerQueryAndParameters(ICriteriaQuery criteriaQuery) { if (innerQuery == null) { ISessionFactoryImplementor factory = criteriaQuery.Factory; innerQuery = new CriteriaQueryTranslator( factory, criteriaImpl, //implicit polymorphism not supported (would need a union) criteriaImpl.EntityOrClassName, criteriaQuery.GenerateSQLAlias(), criteriaQuery); if (innerQuery.HasProjection) { parameters = innerQuery.GetQueryParameters(); types = innerQuery.ProjectedTypes; } else { types = null; } } }
public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary <string, IFilter> enabledFilters) { ISessionFactoryImplementor factory = criteriaQuery.Factory; var innerQuery = new CriteriaQueryTranslator( factory, criteriaImpl, //implicit polymorphism not supported (would need a union) criteriaImpl.EntityOrClassName, criteriaQuery.GenerateSQLAlias(), criteriaQuery); types = innerQuery.HasProjection ? innerQuery.ProjectedTypes : null; if (innerQuery.HasProjection == false) { throw new QueryException("Cannot use subqueries on a criteria without a projection."); } IOuterJoinLoadable persister = (IOuterJoinLoadable)factory.GetEntityPersister(criteriaImpl.EntityOrClassName); //patch to generate joins on subqueries //stolen from CriteriaLoader CriteriaJoinWalker walker = new CriteriaJoinWalker(persister, innerQuery, factory, criteriaImpl, criteriaImpl.EntityOrClassName, enabledFilters); parameters = innerQuery.GetQueryParameters(); // parameters can be inferred only after initialize the walker SqlString sql = walker.SqlString; if (criteriaImpl.FirstResult != 0 || criteriaImpl.MaxResults != RowSelection.NoValue) { int? offset = Loader.Loader.GetOffsetUsingDialect(parameters.RowSelection, factory.Dialect); int? limit = Loader.Loader.GetLimitUsingDialect(parameters.RowSelection, factory.Dialect); Parameter offsetParameter = offset.HasValue ? innerQuery.CreateSkipParameter(offset.Value) : null; Parameter limitParameter = limit.HasValue ? innerQuery.CreateTakeParameter(limit.Value) : null; sql = factory.Dialect.GetLimitString(sql, offset, limit, offsetParameter, limitParameter); } SqlStringBuilder buf = new SqlStringBuilder().Add(ToLeftSqlString(criteria, criteriaQuery)); if (op != null) { buf.Add(" ").Add(op).Add(" "); } if (quantifier != null && prefixOp) { buf.Add(quantifier).Add(" "); } buf.Add("(").Add(sql).Add(")"); if (quantifier != null && prefixOp == false) { buf.Add(" ").Add(quantifier); } return(buf.ToSqlString()); }
public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary <string, IFilter> enabledFilters) { InitializeInnerQueryAndParameters(criteriaQuery); if (innerQuery.HasProjection == false) { throw new QueryException("Cannot use subqueries on a criteria without a projection."); } ISessionFactoryImplementor factory = criteriaQuery.Factory; IOuterJoinLoadable persister = (IOuterJoinLoadable)factory.GetEntityPersister(criteriaImpl.EntityOrClassName); //patch to generate joins on subqueries //stolen from CriteriaLoader CriteriaJoinWalker walker = new CriteriaJoinWalker(persister, innerQuery, factory, criteriaImpl, criteriaImpl.EntityOrClassName, enabledFilters); parameters = innerQuery.GetQueryParameters(); // parameters can be inferred only after initialize the walker SqlString sql = walker.SqlString; if (criteriaImpl.FirstResult != 0 || criteriaImpl.MaxResults != RowSelection.NoValue) { int? offset = Loader.Loader.GetOffsetUsingDialect(parameters.RowSelection, factory.Dialect); int? limit = Loader.Loader.GetLimitUsingDialect(parameters.RowSelection, factory.Dialect); Parameter offsetParameter = offset.HasValue ? innerQuery.CreateSkipParameter(offset.Value) : null; Parameter limitParameter = limit.HasValue ? innerQuery.CreateTakeParameter(limit.Value) : null; sql = factory.Dialect.GetLimitString(sql, offset, limit, offsetParameter, limitParameter); } // during CriteriaImpl.Clone we are doing a shallow copy of each criterion. // this is not a problem for common criterion but not for SubqueryExpression because here we are holding the state of inner CriteriaTraslator (ICriteriaQuery). // After execution (ToSqlString) we have to clean the internal state because the next execution may be performed in a different tree reusing the same istance of SubqueryExpression. innerQuery = null; SqlStringBuilder buf = new SqlStringBuilder().Add(ToLeftSqlString(criteria, criteriaQuery)); if (op != null) { buf.Add(" ").Add(op).Add(" "); } if (quantifier != null && prefixOp) { buf.Add(quantifier).Add(" "); } buf.Add("(").Add(sql).Add(")"); if (quantifier != null && prefixOp == false) { buf.Add(" ").Add(quantifier); } return(buf.ToSqlString()); }
private void CombineCriteriaQueries() { foreach (CriteriaLoader loader in loaders) { CriteriaQueryTranslator translator = loader.Translator; translators.Add(translator); QueryParameters queryParameters = translator.GetQueryParameters(); parameters.Add(queryParameters); ISqlCommand singleCommand = loader.CreateSqlCommand(queryParameters, session); resultSetsCommand.Append(singleCommand); } }
private void CombineCriteriaQueries() { foreach (CriteriaLoader loader in loaders) { CriteriaQueryTranslator translator = loader.Translator; translators.Add(translator); QueryParameters queryParameters = translator.GetQueryParameters(); parameters.Add(queryParameters); SqlCommandInfo commandInfo = loader.GetQueryStringAndTypes(session, queryParameters, resultSetsCommand.ParametersCount); resultSetsCommand.Append(commandInfo); } }
private void CombineCriteriaQueries() { foreach (CriteriaLoader loader in loaders) { CriteriaQueryTranslator translator = loader.Translator; translators.Add(translator); QueryParameters queryParameters = translator.GetQueryParameters(); parameters.Add(queryParameters); SqlCommandInfo commandInfo = loader.GetQueryStringAndTypes(session, queryParameters); sqlString = sqlString.Append(commandInfo.Text) .Append(session.Factory.ConnectionProvider.Driver.MultipleQueriesSeparator) .Append(Environment.NewLine); types.AddRange(commandInfo.ParameterTypes); } }