示例#1
0
        private string ResolveCollectionProperties(
            string aliasName,
            string propertyName,
            IDictionary fieldResults,
            ISqlLoadable elementPersister,
            ISqlLoadableCollection currentPersister,
            string suffix,
            string persisterSuffix)
        {
            if ("*".Equals(propertyName))
            {
                if (fieldResults.Count > 0)
                {
                    throw new QueryException("Using return-propertys together with * syntax is not supported.");
                }

                string selectFragment = currentPersister.SelectFragment(aliasName, suffix);
                aliasesFound++;
                return selectFragment
                       + ", "
                       + ResolveProperties(aliasName, propertyName, fieldResults, elementPersister, persisterSuffix);
            }
            else if ("element.*".Equals(propertyName))
            {
                return ResolveProperties(aliasName, "*", fieldResults, elementPersister, persisterSuffix);
            }
            else
            {
                string[] columnAliases;

                // Let return-propertys override whatever the persister has for aliases.
                columnAliases = (string[]) fieldResults[propertyName];
                if (columnAliases == null)
                {
                    columnAliases = currentPersister.GetCollectionPropertyColumnAliases(propertyName, suffix);
                }

                if (columnAliases == null || columnAliases.Length == 0)
                {
                    throw new QueryException("No column name found for property [" +
                                             propertyName +
                                             "] for alias [" + aliasName + "]",
                                             sqlQuery);
                }
                if (columnAliases.Length != 1)
                {
                    // TODO: better error message since we actually support composites if names are explicitly listed.
                    throw new QueryException("SQL queries only support properties mapped to a single column - property [" +
                                             propertyName +
                                             "] is mapped to " +
                                             columnAliases.Length +
                                             " columns.",
                                             sqlQuery);
                }
                aliasesFound++;
                return columnAliases[0];
            }
        }
		public ColumnCollectionAliases(IDictionary<string, string[]> userProvidedAliases, ISqlLoadableCollection persister)
		{
			this.userProvidedAliases = userProvidedAliases;

			keyAliases = GetUserProvidedAliases("key", persister.KeyColumnNames);

			indexAliases = GetUserProvidedAliases("index", persister.IndexColumnNames);

			elementAliases = GetUserProvidedAliases("element", persister.ElementColumnNames);

			identifierAlias = GetUserProvidedAlias("id", persister.IdentifierColumnName);
		}
		public ColumnCollectionAliases(IDictionary<string, string[]> userProvidedAliases, ISqlLoadableCollection persister)
		{
			this.userProvidedAliases = userProvidedAliases;

			this.keyAliases = GetUserProvidedAliases("key", persister.KeyColumnNames);
			this.indexAliases = GetUserProvidedAliases("index", persister.IndexColumnNames);

			// NH-1612: Add aliases for all composite element properties to support access
			// to individual composite element properties in <return-property> elements.
			this.elementAliases = persister.ElementType.IsComponentType
				? GetUserProvidedCompositeElementAliases(persister.ElementColumnNames)
				: GetUserProvidedAliases("element", persister.ElementColumnNames);

			this.identifierAlias = GetUserProvidedAlias("id", persister.IdentifierColumnName);
		}
        private void AddCollection(string role, string alias, IDictionary <string, string[]> propertyResults)
        {
            ISqlLoadableCollection collectionPersister = (ISqlLoadableCollection)Factory.GetCollectionPersister(role);

            alias2CollectionPersister[alias] = collectionPersister;
            string suffix = GenerateCollectionSuffix();

            log.Debug("mapping alias [{0}] to collection-suffix [{1}]", alias, suffix);
            alias2CollectionSuffix[alias]       = suffix;
            collectionPropertyResultMaps[alias] = propertyResults;

            if (collectionPersister.IsOneToMany)
            {
                ISqlLoadable persister = (ISqlLoadable)collectionPersister.ElementPersister;
                AddPersister(alias, Filter(propertyResults), persister);
            }
        }
		public NonScalarReturn(SQLQueryContext context, bool queryHasAliases, string alias, LockMode lockMode, NonScalarReturn owner)
		{
			if (context == null)
			{
				throw new ArgumentNullException("context");
			}
			if (string.IsNullOrEmpty(alias))
			{
				throw new HibernateException("alias must be specified");
			}

			this.alias = alias;
			this.lockMode = lockMode;
			this.owner = owner;

			this.collectionPersister = context.GetCollectionPersister(alias);
			if (this.collectionPersister != null)
			{
				var collectionPropertyResultMap = context.GetCollectionPropertyResultsMap(alias);
				this.collectionAliases = queryHasAliases
					? new GeneratedCollectionAliases(collectionPropertyResultMap, this.collectionPersister, context.GetCollectionSuffix(alias))
					: (ICollectionAliases)new ColumnCollectionAliases(collectionPropertyResultMap, this.collectionPersister);
			}

			if (this.collectionPersister == null || this.CollectionPersister.ElementType.IsEntityType)
			{
				this.entityPersister = context.GetEntityPersister(alias);
				if (this.entityPersister != null)
				{
					var entityPropertyResultMap = context.GetEntityPropertyResultsMap(alias);
					this.entityAliases = queryHasAliases
						? new DefaultEntityAliases(entityPropertyResultMap, this.entityPersister, context.GetEntitySuffix(alias))
						: new ColumnEntityAliases(entityPropertyResultMap, this.entityPersister);
				}
			}
		}
        public IList GenerateCustomReturns(bool queryHadAliases)
        {
            IList customReturns = new List <object>();
            IDictionary <string, object> customReturnsByAlias = new Dictionary <string, object>();

            for (int i = 0; i < queryReturns.Length; i++)
            {
                if (queryReturns[i] is NativeSQLQueryScalarReturn)
                {
                    NativeSQLQueryScalarReturn rtn = (NativeSQLQueryScalarReturn)queryReturns[i];
                    customReturns.Add(new ScalarReturn(rtn.Type, rtn.ColumnAlias));
                }
                else if (queryReturns[i] is NativeSQLQueryRootReturn)
                {
                    NativeSQLQueryRootReturn rtn = (NativeSQLQueryRootReturn)queryReturns[i];
                    string         alias         = rtn.Alias;
                    IEntityAliases entityAliases;
                    if (queryHadAliases || HasPropertyResultMap(alias))
                    {
                        entityAliases =
                            new DefaultEntityAliases(entityPropertyResultMaps[alias], alias2Persister[alias], alias2Suffix[alias]);
                    }
                    else
                    {
                        entityAliases =
                            new ColumnEntityAliases(entityPropertyResultMaps[alias], alias2Persister[alias], alias2Suffix[alias]);
                    }
                    RootReturn customReturn = new RootReturn(alias, rtn.ReturnEntityName, entityAliases, rtn.LockMode);
                    customReturns.Add(customReturn);
                    customReturnsByAlias[rtn.Alias] = customReturn;
                }
                else if (queryReturns[i] is NativeSQLQueryCollectionReturn)
                {
                    NativeSQLQueryCollectionReturn rtn = (NativeSQLQueryCollectionReturn)queryReturns[i];
                    string alias = rtn.Alias;
                    ISqlLoadableCollection persister = alias2CollectionPersister[alias];
                    bool isEntityElements            = persister.ElementType.IsEntityType;
                    ICollectionAliases collectionAliases;
                    IEntityAliases     elementEntityAliases = null;
                    if (queryHadAliases || HasPropertyResultMap(alias))
                    {
                        collectionAliases =
                            new GeneratedCollectionAliases(collectionPropertyResultMaps[alias], alias2CollectionPersister[alias],
                                                           alias2CollectionSuffix[alias]);
                        if (isEntityElements)
                        {
                            elementEntityAliases =
                                new DefaultEntityAliases(entityPropertyResultMaps[alias], alias2Persister[alias], alias2Suffix[alias]);
                        }
                    }
                    else
                    {
                        collectionAliases =
                            new ColumnCollectionAliases(collectionPropertyResultMaps[alias], alias2CollectionPersister[alias]);
                        if (isEntityElements)
                        {
                            elementEntityAliases =
                                new ColumnEntityAliases(entityPropertyResultMaps[alias], alias2Persister[alias], alias2Suffix[alias]);
                        }
                    }
                    CollectionReturn customReturn =
                        new CollectionReturn(alias, rtn.OwnerEntityName, rtn.OwnerProperty, collectionAliases, elementEntityAliases,
                                             rtn.LockMode);
                    customReturns.Add(customReturn);
                    customReturnsByAlias[rtn.Alias] = customReturn;
                }
                else if (queryReturns[i] is NativeSQLQueryJoinReturn)
                {
                    NativeSQLQueryJoinReturn rtn = (NativeSQLQueryJoinReturn)queryReturns[i];
                    string                 alias = rtn.Alias;
                    FetchReturn            customReturn;
                    NonScalarReturn        ownerCustomReturn = (NonScalarReturn)customReturnsByAlias[rtn.OwnerAlias];
                    ISqlLoadableCollection persister;
                    if (alias2CollectionPersister.TryGetValue(alias, out persister))
                    {
                        bool isEntityElements = persister.ElementType.IsEntityType;
                        ICollectionAliases collectionAliases;
                        IEntityAliases     elementEntityAliases = null;
                        if (queryHadAliases || HasPropertyResultMap(alias))
                        {
                            collectionAliases =
                                new GeneratedCollectionAliases(collectionPropertyResultMaps[alias], persister, alias2CollectionSuffix[alias]);
                            if (isEntityElements)
                            {
                                elementEntityAliases =
                                    new DefaultEntityAliases(entityPropertyResultMaps[alias], alias2Persister[alias], alias2Suffix[alias]);
                            }
                        }
                        else
                        {
                            collectionAliases = new ColumnCollectionAliases(collectionPropertyResultMaps[alias], persister);
                            if (isEntityElements)
                            {
                                elementEntityAliases =
                                    new ColumnEntityAliases(entityPropertyResultMaps[alias], alias2Persister[alias], alias2Suffix[alias]);
                            }
                        }
                        customReturn =
                            new CollectionFetchReturn(alias, ownerCustomReturn, rtn.OwnerProperty, collectionAliases, elementEntityAliases,
                                                      rtn.LockMode);
                    }
                    else
                    {
                        IEntityAliases entityAliases;
                        if (queryHadAliases || HasPropertyResultMap(alias))
                        {
                            entityAliases =
                                new DefaultEntityAliases(entityPropertyResultMaps[alias], alias2Persister[alias], alias2Suffix[alias]);
                        }
                        else
                        {
                            entityAliases =
                                new ColumnEntityAliases(entityPropertyResultMaps[alias], alias2Persister[alias], alias2Suffix[alias]);
                        }
                        customReturn = new EntityFetchReturn(alias, entityAliases, ownerCustomReturn, rtn.OwnerProperty, rtn.LockMode);
                    }
                    customReturns.Add(customReturn);
                    customReturnsByAlias[alias] = customReturn;
                }
            }
            return(customReturns);
        }
示例#7
0
        private string ResolveCollectionProperties(string aliasName, string propertyName)
        {
            IDictionary <string, string[]> fieldResults        = context.GetPropertyResultsMapByAlias(aliasName);
            ISqlLoadableCollection         collectionPersister = context.GetCollectionPersisterByAlias(aliasName);
            string collectionSuffix = context.GetCollectionSuffixByAlias(aliasName);

            // NH Different behavior for NH-1612
            if ("*".Equals(propertyName))
            {
                if (fieldResults.Count != 0)
                {
                    throw new QueryException("Using return-propertys together with * syntax is not supported.");
                }

                string selectFragment = collectionPersister.SelectFragment(aliasName, collectionSuffix);
                aliasesFound++;

                // Collection may just contain elements and no entities, in which case resolution of
                // collection properties is enough.
                return(collectionPersister.ElementType.IsEntityType
                                        ? selectFragment + ", " + ResolveProperties(aliasName, "*")
                                        : selectFragment);
            }

            if (propertyName.StartsWith("element."))
            {
                string elementPropertyName = propertyName.Substring("element.".Length);

                if (collectionPersister.ElementType.IsEntityType)
                {
                    return(ResolveProperties(aliasName, elementPropertyName));
                }
                else if (elementPropertyName == "*")
                {
                    throw new QueryException("Using element.* syntax is only supported for entity elements.");
                }
            }

            string[] columnAliases;

            // Let return-propertys override whatever the persister has for aliases.
            if (!fieldResults.TryGetValue(propertyName, out columnAliases))
            {
                columnAliases = collectionPersister.GetCollectionPropertyColumnAliases(propertyName, collectionSuffix);
            }

            if (columnAliases == null || columnAliases.Length == 0)
            {
                throw new QueryException("No column name found for property [" + propertyName + "] for alias [" + aliasName + "]",
                                         originalQueryString);
            }
            if (columnAliases.Length != 1)
            {
                // TODO: better error message since we actually support composites if names are explicitly listed.
                throw new QueryException(
                          "SQL queries only support properties mapped to a single column - property [" + propertyName + "] is mapped to "
                          + columnAliases.Length + " columns.", originalQueryString);
            }
            aliasesFound++;
            return(columnAliases[0]);
        }
        public ColumnCollectionAliases(IDictionary <string, string[]> userProvidedAliases, ISqlLoadableCollection persister)
        {
            this.userProvidedAliases = userProvidedAliases;

            keyAliases = GetUserProvidedAliases("key", persister.KeyColumnNames);

            indexAliases = GetUserProvidedAliases("index", persister.IndexColumnNames);

            elementAliases = GetUserProvidedAliases("element", persister.ElementColumnNames);

            identifierAlias = GetUserProvidedAlias("id", persister.IdentifierColumnName);
        }
 public ColumnCollectionAliases(IDictionary <string, string[]> userProvidedAliases, ISqlLoadableCollection persister)
 {
     keyAliases      = GetUserProvidedAliases(userProvidedAliases, CollectionPersister.PropKey, persister.KeyColumnNames);
     indexAliases    = GetUserProvidedAliases(userProvidedAliases, CollectionPersister.PropIndex, persister.IndexColumnNames);
     elementAliases  = GetUserProvidedAliases(userProvidedAliases, CollectionPersister.PropElement, persister.ElementColumnNames);
     identifierAlias = GetUserProvidedAlias(userProvidedAliases, CollectionPersister.PropId, persister.IdentifierColumnName);
 }