예제 #1
0
        /// <summary>
        /// Converts the SimpleExpression to a <see cref="SqlString"/>.
        /// </summary>
        /// <returns>A SqlString that contains a valid Sql fragment.</returns>
        public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary <string, IFilter> enabledFilters)
        {
            SqlString[] columnNames =
                CriterionUtil.GetColumnNamesForSimpleExpression(
                    propertyName,
                    _projection,
                    criteriaQuery,
                    criteria,
                    enabledFilters,
                    this,
                    value);

            Parameter[] parameters = criteriaQuery.NewQueryParameter(GetParameterTypedValue(criteria, criteriaQuery)).ToArray();

            if (ignoreCase)
            {
                if (columnNames.Length != 1)
                {
                    throw new HibernateException(
                              "case insensitive expression may only be applied to single-column properties: " +
                              propertyName);
                }

                return(new SqlStringBuilder(6)
                       .Add(criteriaQuery.Factory.Dialect.LowercaseFunction)
                       .Add(StringHelper.OpenParen)
                       .Add(columnNames[0])
                       .Add(StringHelper.ClosedParen)
                       .Add(Op)
                       .Add(parameters.Single())
                       .ToSqlString());
            }
            else
            {
                SqlStringBuilder sqlBuilder = new SqlStringBuilder(4 * columnNames.Length);

                for (int i = 0; i < columnNames.Length; i++)
                {
                    if (i > 0)
                    {
                        sqlBuilder.Add(" and ");
                    }

                    sqlBuilder.Add(columnNames[i])
                    .Add(Op)
                    .Add(parameters[i]);
                }
                return(sqlBuilder.ToSqlString());
            }
        }
예제 #2
0
        /// <summary>
        /// Converts the SimpleExpression to a <see cref="SqlString"/>.
        /// </summary>
        /// <returns>A SqlString that contains a valid Sql fragment.</returns>
        public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary <string, IFilter> enabledFilters)
        {
            SqlString[] columnNames =
                CriterionUtil.GetColumnNamesForSimpleExpression(
                    propertyName,
                    _projection,
                    criteriaQuery,
                    criteria,
                    enabledFilters,
                    this,
                    value);

            TypedValue typedValue = GetParameterTypedValue(criteria, criteriaQuery);

            Parameter[] parameters = criteriaQuery.NewQueryParameter(typedValue).ToArray();

            if (ignoreCase)
            {
                if (columnNames.Length != 1)
                {
                    throw new HibernateException(
                              "case insensitive expression may only be applied to single-column properties: " +
                              propertyName);
                }

                return(new SqlString(
                           criteriaQuery.Factory.Dialect.LowercaseFunction,
                           StringHelper.OpenParen,
                           columnNames[0],
                           StringHelper.ClosedParen,
                           Op,
                           parameters.Single()));
            }
            else
            {
                SqlStringBuilder sqlBuilder = new SqlStringBuilder(4 * columnNames.Length);
                var columnNullness          = typedValue.Type.ToColumnNullness(typedValue.Value, criteriaQuery.Factory);

                if (columnNullness.Length != columnNames.Length)
                {
                    throw new AssertionFailure("Column nullness length doesn't match number of columns.");
                }

                for (int i = 0; i < columnNames.Length; i++)
                {
                    if (i > 0)
                    {
                        sqlBuilder.Add(" and ");
                    }

                    if (columnNullness[i])
                    {
                        sqlBuilder.Add(columnNames[i])
                        .Add(Op)
                        .Add(parameters[i]);
                    }
                    else
                    {
                        sqlBuilder.Add(columnNames[i])
                        .Add(" is null ");
                    }
                }
                return(sqlBuilder.ToSqlString());
            }
        }