From: NHibernate J. <mik...@us...> - 2007-08-10 08:11:06
|
Query cache does not work when using Criteria API to create a projection qu= ery with a result transformer ---------------------------------------------------------------------------= ----------------------------- Key: NH-1090 URL: http://jira.nhibernate.org/browse/NH-1090 Project: NHibernate Issue Type: Bug Components: Core Affects Versions: 1.2.0.GA, 2.0.0.Alpha1, LATER Reporter: Olli Ryh=C3=A4nen Priority: Major Enabling query-cache on a projection query with a result transformer attach= ed using Criteria API, will fail with an exception: "System.InvalidCastException: Unable to cast object of type '<The output ty= pe from the result transformer' to type 'System.Object[]'" The exception is caused by the line: "cacheable.Add( TypeFactory.Disassemble( ( object[ ] ) result[ i ], returnT= ypes, session ) );" in "NHibernate\Cache\StandardQueryCache.cs" on line 63, when it tries to ca= st the "result[i]" to an "object[]". Using result transformers the result set has already been transformed to th= e transformed type, before adding to the cache, so casting to "object[]" wi= ll fail. (The transformation is done in the method "GetResultColumnOrRow" i= n CriteriaLoader.cs on line 74, which gets called in process of loading the= result set from the database). To reproduce the issue, turn on caching on any of the projection query test= s with result transformer in "CriteriaQueryTests.cs". E.g. on line 494 IList resultWithAliasedBean =3D s.CreateCriteria(typeof (Enrolment)) .CreateAlias("Student", "st") .CreateAlias("Course", "co") .SetProjection(Projections.ProjectionList() .Add(Projections.Property("st.Name"), "studentName") .Add(Projections.Property("co.Description"), "courseDescription") ) .AddOrder(Order.Desc("studentName")) .SetResultTransformer(Transformers.AliasToBean(typeof (StudentDTO))) .SetCacheable(true) .List(); A simple fix would be to check if the type of "result[i]" is an "object[]" = before adding to the cache and cache non "object[]" types as is to the cach= e (and do the same check when getting the items back from the cache), but I= 'm not sure if that would break the caching architecture in some way.=20 --=20 This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: htt= p://jira.nhibernate.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |