I have a similar issue with my criteria.  I have a Person entity that
has a sub object of a PersonAddress entity.  For example, I want to
get all person records that have a Person.CustomerId = 1 and a
PersonAddress.State = "MA".  I expect to get back one Person record
with one PersonAddress record in my sub-object.  However, I have 2
records in the PersonAddress table, one with a state of MA, and
another with a state of CT.  When I run my search using HQL and browse
the PersonAddress collection within my Person entity, I see only 1
address.  However, if I use ICriteria to do my search and browse the
PersonAddress collection, I see both PersonAddress records.  In
addition, I can confirm that a second fetch is done to the DB to
retrieve ALL of the PersonAddress records.  Why is this so?

The code that I use to generate the ICriteria:

            ICriteria criteria = Session.CreateCriteria(typeof
(Person), "pers");

            DetachedCriteria sub = DetachedCriteria.For<PersonAddress>
("persAddr");
            sub.Add(Expression.Conjunction()
                .Add(Expression.Like("persAddr.State", "MA"))
                .Add(Expression.EqProperty("persAddr.PersonID",
"pers.PersonID")));

            sub.SetProjection(Projections.Id());

            criteria.SetResultTransformer(new
NHibernate.Transform.DistinctRootEntityResultTransformer());

            retObject = criteria.List<Person>() as List<Person>;

Many thanks in advance


On Nov 7, 11:05 am, fknebels <[email protected]> wrote:
> FetchMode just adds an outer join to the query which will result in a
> Cartesian project which I definitely don't want.  The SQL that is
> generated is exactly what I want.  I have all the fields for everyobjectin 
> theobjectgraph.  I thought that the RootEntityTransformer
> would then populate the entireobjectgraph with actuallyobjectand
> not proxies, but when I iterate on the a one to many relationship, I
> see eachobjectin the graph calling out to sql server.  I shouldn't
> need other techniques because the generated SQL returns all the fields
> I need.  That's the whole point of writing this query and not just
> walking through everyobject.
>
> On Nov 6, 5:15 pm, Jason Meckley <[email protected]> wrote:
>
> > if you want to select the data you need to set the fetch mode, not the
> > join mode. however you may find that loading everything in a single
> > query may besub-optimal. you will end up with a Cartesian result set
> > (lot of duplicated data). If that is the case you could try other
> > techniques: ado.net batching (this may only apply to writes, not
> > reads), multi-queries,sub-select batching, filters. Even though you
> > execute multiple remote db calls, the results sets are unique and the
> > throughput could increase.
>
> > also, if your collections use a List instead of a Set you may get
> > duplicate items in the collections. A Set is the only collection that
> > ensure uniqueness.
>
> > On Nov 6, 4:37 pm, fknebels <[email protected]> wrote:
>
> > > I've got a iCriteria query that joins 7 different tables.  The SQL it
> > > generates is exactly what I want.  I thought I would be able to
> > > populate the entireobjecttree from this query, but as I iterate over
> > > child objects I see queries getting sent to SQL server using NHProf.
> > > How do I get this ICriteria to load the entireobjecttree?  This is
> > > the query:
>
> > >             return session.CreateCriteria(typeof(MatchRuleGroup))
> > >                 .Add(Restrictions.Eq("Name", Name.Trim()))
> > >                 .CreateAlias("GroupSets", "groupsSet",
> > > NHibernate.SqlCommand.JoinType.InnerJoin)
> > >                 .CreateCriteria("groupsSet.RuleSet", "ruleset",
> > > NHibernate.SqlCommand.JoinType.InnerJoin)
> > >                 .CreateAlias("ruleset.Comparisons", "comparison",
> > > NHibernate.SqlCommand.JoinType.InnerJoin)
> > >                 .CreateCriteria("comparison.Rule", "rule",
> > > NHibernate.SqlCommand.JoinType.InnerJoin)
> > >                 .CreateCriteria("rule.Field",
> > > NHibernate.SqlCommand.JoinType.InnerJoin)
> > >                 .CreateCriteria("rule.Pattern",
> > > NHibernate.SqlCommand.JoinType.InnerJoin)
> > >                 .SetResultTransformer(new
> > > NHibernate.Transform.RootEntityResultTransformer());
>
> > > Thanks,
> > > Fran

--

You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.


Reply via email to