Skip to content

Improve exception for query on delayed id #3043

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 19, 2022

Conversation

fredericDelaporte
Copy link
Member

Test #3041

The question is, should we improve the exception, offer an option to still flush the entity in such case, do something else, or nothing?

Full exception of the failing case:

NHibernate.Exceptions.GenericADOException: could not execute query
[ select mychild0_.Id as id1_2_, mychild0_.Name as name2_2_, mychild0_.inv_parent_id as inv3_2_ from my_child mychild0_ where mychild0_.inv_parent_id=? ]
  Name:p1 - Value:NHibernate.Test.Generatedkeys.Identity.MyEntity
[SQL: select mychild0_.Id as id1_2_, mychild0_.Name as name2_2_, mychild0_.inv_parent_id as inv3_2_ from my_child mychild0_ where mychild0_.inv_parent_id=?] ---> System.InvalidCastException: Impossible d'effectuer un cast d'un objet de type 'NHibernate.Action.DelayedPostInsertIdentifier' en type 'System.IConvertible'.
   à System.Convert.ToInt64(Object value)
   à NHibernate.Type.Int64Type.Set(DbCommand rs, Object value, Int32 index, ISessionImplementor session) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Type\Int64Type.cs:ligne 61
   à NHibernate.Type.NullableType.NullSafeSet(DbCommand st, Object value, Int32 index, ISessionImplementor session) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Type\NullableType.cs:ligne 162
   à NHibernate.Type.ManyToOneType.NullSafeSet(DbCommand cmd, Object value, Int32 index, ISessionImplementor session) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Type\ManyToOneType.cs:ligne 66
   à NHibernate.Param.NamedParameterSpecification.Bind(DbCommand command, IList`1 multiSqlQueryParametersList, Int32 singleSqlParametersOffset, IList`1 sqlQueryParametersList, QueryParameters queryParameters, ISessionImplementor session) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Param\NamedParameterSpecification.cs:ligne 64
   à NHibernate.Param.NamedParameterSpecification.Bind(DbCommand command, IList`1 sqlQueryParametersList, QueryParameters queryParameters, ISessionImplementor session) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Param\NamedParameterSpecification.cs:ligne 55
   à NHibernate.SqlCommand.SqlCommandImpl.Bind(DbCommand command, ISessionImplementor session) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\SqlCommand\SqlCommandImpl.cs:ligne 156
   à NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters queryParameters, Boolean scroll, ISessionImplementor session) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Loader.cs:ligne 1466
   à NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Loader.cs:ligne 503
   à NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Loader.cs:ligne 303
   à NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Loader.cs:ligne 1972
   --- Fin de la trace de la pile d'exception interne ---
   à NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Loader.cs:ligne 1981
   à NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Loader.cs:ligne 1950
   à NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Loader.cs:ligne 1837
   à NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Loader.cs:ligne 1827
   à NHibernate.Loader.Hql.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Loader\Hql\QueryLoader.cs:ligne 325
   à NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:ligne 131
   à NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Engine\Query\HQLQueryPlan.cs:ligne 115
   à NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results, Object filterConnection) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:ligne 559
   à NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:ligne 523
   à NHibernate.Impl.AbstractSessionImpl.List[T](IQueryExpression query, QueryParameters parameters) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Impl\AbstractSessionImpl.cs:ligne 182
   à NHibernate.Impl.AbstractQueryImpl2.List[T]() dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Impl\AbstractQueryImpl2.cs:ligne 111
   à NHibernate.Linq.DefaultQueryProvider.ExecuteList[TResult](Expression expression) dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:ligne 111
   à NHibernate.Linq.NhQueryable`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() dans E:\Projets\nhibernate\nhibernate-core\src\NHibernate\Linq\NhQueryable.cs:ligne 65
   à System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   à System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
   à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   à NUnit.Framework.Internal.ExceptionHelper.Rethrow(Exception exception)
   à NUnit.Framework.Internal.Reflect.DynamicInvokeWithTransparentExceptions(Delegate delegate)
   à NUnit.Framework.Internal.ExceptionHelper.RecordException(Delegate parameterlessDelegate, String parameterName)

@fredericDelaporte
Copy link
Member Author

fredericDelaporte commented Apr 10, 2022

The less intrusive way to handle a better exception I find would be to implement IConvertible on DelayedPostInsertIdentifier. In this interface implementation, we would be able to raise an exception with a better message.

Another way, catching the exception and trying to interpret it as being the trouble we currently discuss, would be quite brittle, and may require to handle it at different places.

Maybe we could also add an overload with a forbidDelayed parameter to EntityType.GetReferenceValue, called by NullSafeSet methods of ManyToOneType and OneToOneType.
It does not look valid to me to call NullSafeSet with a delayed identity as a value, so we could consider better to handle this trouble there.

@fredericDelaporte fredericDelaporte changed the title Add test case for query on delayed id Improve exception for query on delayed id Apr 17, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants