示例#1
0
        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;
                }
            }
        }
示例#2
0
        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());
        }
示例#3
0
        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());
        }
示例#4
0
 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);
     }
 }
示例#5
0
 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);
     }
 }
示例#6
0
 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);
     }
 }