Замок ActiveRecord HQL-запрос: исключение: «Невозможно привести объект типа System.Guid к типу System.IConvertible». - PullRequest
0 голосов
/ 24 февраля 2012

Недавно я столкнулся с проблемой, которая поставила меня в тупик, в основном из-за неустойчивой частоты, с которой он появляется.

Я выполняю следующий запрос HQL:

SELECT prod.ProductType.ID,
    prod.Provider.ProviderType.ID,
    r.Term.ID,
    MAX(r.InterestRate),
    MAX(CAST(r.ID AS String))
FROM Product prod
    JOIN prod.Rates r
WHERE prod.ArchivedAt IS NULL
    AND prod.Active = TRUE
    AND prod.Provider.ArchivedAt IS NULL
    AND prod.Provider.Enabled = TRUE
GROUP BY prod.ProductType.ID,
    r.Term.ID,
    prod.Provider.ProviderType.ID

Важно отметить, что все поля идентификатора являются GUID, и что последнее выбранное значение - мой способ вернуть произвольный Guid из набора.Не важно, какой из них я получу.

Выполнение этого запроса не всегда приводит к сбою.Фактически, в течение всего цикла отладки все было в порядке, и запрос выполнялся правильно и возвращал правильные данные.

Однако, как только код был запущен в производство, а первоначальное тестирование показалось хорошим, some пользователи сообщили об ошибках, и поэтому был просмотрен журнал ошибок, и в нем появилось многократное появление следующего:

Castle.ActiveRecord.Framework.ActiveRecordException: Could not perform ExecuteQuery for Product ---> NHibernate.ADOException: could not execute query
[ select product0_.ProductTypeID as col_0_0_, provider2_.ProviderTypeID as col_1_0_, rates1_.TermID as col_2_0_, MAX(rates1_.InterestRate) as col_3_0_, cast(MAX(cast(rates1_.ID as NVARCHAR(255))) as UNIQUEIDENTIFIER) as col_4_0_ from Product product0_ inner join ProductRate rates1_ on product0_.ID=rates1_.ProductID, Provider provider2_ where product0_.ProviderID=provider2_.ID and (product0_.ArchivedAt is null) and product0_.Active=1 and (provider2_.ArchivedAt is null) and provider2_.Enabled=1 group by product0_.ProductTypeID , rates1_.TermID , provider2_.ProviderTypeID ]
---> System.FormatException: Input string 'f94be876-d5b6-4e35-bf2c-a0010099cd9a' was not in the correct format. ---> System.InvalidCastException: Unable to cast object of type 'System.Guid' to type 'System.IConvertible'.
    at System.Convert.ToInt32(Object value)
    at NHibernate.Type.Int32Type.Get(IDataReader rs, Int32 index)
    --- End of inner exception stack trace ---
    at NHibernate.Type.Int32Type.Get(IDataReader rs, Int32 index)
    at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
    at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
    at NHibernate.Dialect.Function.CastFunction.LazyType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
    at NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.GetResultColumnOrRow(Object[] row, IResultTransformer resultTransformer, IDataReader rs, ISessionImplementor session)
    at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
    at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
    at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
    at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
    --- End of inner exception stack trace ---
    at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
    at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
    at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
    at NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters)
    at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters)
    at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results)
    at NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results)
    at NHibernate.Impl.SessionImpl.List(String query, QueryParameters parameters)
    at NHibernate.Impl.QueryImpl.List()
    at Castle.ActiveRecord.ActiveRecordBaseQuery.InternalExecute(ISession session)
    at Castle.ActiveRecord.ActiveRecordBaseQuery.Castle.ActiveRecord.IActiveRecordQuery.Execute(ISession session)
    at Castle.ActiveRecord.ActiveRecordBase.ExecuteQuery(IActiveRecordQuery query)
    --- End of inner exception stack trace ---
    at Castle.ActiveRecord.ActiveRecordBase.ExecuteQuery(IActiveRecordQuery query)
    at Castle.ActiveRecord.ActiveRecordMediator.ExecuteQuery(IActiveRecordQuery q)

Теперь это сначала смущает меня, потому что, хотя я легко вижу, как это руководство не будетбыть разбираемым в int, я не понимаю, почему, во-первых, такая попытка будет предпринята, во-вторых, потому что приведенный выше SQL-запрос выполняется без проблем.

Может кто-нибудь пролить свет на этот вопрос??Даже самый маленький кусочек информации поможет, поскольку в настоящее время я даже не знаю, с чего начать поиск ошибки.

РЕДАКТИРОВАТЬ: Расширение трассировки стека

...