thanks for the response fabio. few questions: 1. as far as i can see this is also something that is set via mappings and cannot be set/overriden for a specific query 2. if this is batch size what's the fetch="subselect" for? 3. it might be impossible to know the required batch size, if the query isn't paged but just filtered with some filter on the entity, and the collections should be fetched for the whole results of the first query
so first of all, i think the improvement of the fetch="subselect" is good for performance in any case don't you think? should i try to focus on enabling batch-size to be set for a specific query instead of focusing on sub select being set for a specific query? do you agree that it could be a nice feature? thanks. On Wed, Sep 1, 2010 at 1:39 AM, Fabio Maulo <[email protected]> wrote: > what you are looking for is not subselect but batch-size. > The batch-size will use IDs of collection-owner loaded in the session. > > > On Tue, Aug 31, 2010 at 4:32 PM, nadav s <[email protected]> wrote: > >> hello, following the jira i've opened that explains the new feature: * >> NH-2316 <http://216.121.112.228/browse/NH-2316>* >> i've started working on it to hopefully upload a patch in the near future. >> >> few issues with the current implementation of subselect fetching: >> >> 1. Its available only in the mappings, and not per criteria\hql query\linq >> query\query over >> >> 2. It isn't overrideable with fetch mode lazy. the reason is that it is >> not set for a specific query, but the persister of the collection, which is >> set as fetch="subselect", is some special persister for sub select fetched >> collections. >> >> 3. the query that is issued because of the subselect is very in-efficient. >> if the first query is: >> >> from Foo f >> where f.Country.Region.Name = 'CoolRegion' >> >> then the sub query created for foo.Children will be: >> >> from Child c >> where c.Foo.Id in >> (select f.Id >> from Foo f >> where f.Country.Region.Name = 'CoolRegion') >> >> >> notice that if the query on foo has joins\sub selects then the query that >> gets foo's children is very inefficient, because after the query on foo was >> executed >> the ids of foo are available so the query could easily be >> >> from Child c >> where c.Foo.Id in (?,?,?...? >> where the ? are the ids of the foos. >> >> the 1 and 2 issues, make the subselect fetch unusuable when there are 2 >> use cases, one where lazy is appropriate and one where subselect fetching is >> appropriate >> first of all, i'll be hapy to get your input about this. >> >> fixing issue 3 was suprisingly easy, >> i've just replaced the code in NHibernate.Engine.SubselectFetch that used >> to take the query string of the original query to be used for the sub select >> and replaced it with this code: >> >> public SqlString ToSubselectString(string ukname) >> { >> SqlStringBuilder sqlBuilder = new SqlStringBuilder(); >> for (int i = 0; i < this.resultingEntityKeys.Count; i++) >> { >> if (i != 0) >> { >> sqlBuilder.Add(","); >> } >> sqlBuilder.AddParameter(); >> } >> SqlString sqlString = sqlBuilder.ToSqlString(); >> return sqlString; >> } >> >> of course i also had to set the query parameters for the ids. >> taking the ids of the original query was easy because they are already >> there (in this.Results) >> all unit tests pass so i think its ok. >> >> about issues 1 and 2 - enabling a FetchMode.SubSelect, and in general, >> making subselect a fetch mode just like join - i wanna start working on that >> but first would like to know that you think all of this is a good idea and >> if you have pointers on how to do it - because >> for criteria its obvious - just use the FetchMode, for Linq its obvious - >> there needs to be an extention method but for hql - should it be a methid of >> IQuery or >> should it be some token in the HQL? >> >> >> for conclusion, i think that once implemented like that, it will be very >> very easy to fetch a whole object graph for a paged query on the aggregate >> root. >> >> thanks in advance. >> Nadav. >> >> >> > > > -- > Fabio Maulo > >
