This group is for development OF NHibernate rather than development WITH
NHibernate.  Please report this on the NHUSERS group (
http://groups.google.com/group/nhusers/).

Steve Bohlen
[email protected]
http://blog.unhandled-exceptions.com
http://twitter.com/sbohlen


On Mon, Aug 8, 2011 at 1:06 PM, HappyNomad <[email protected]> wrote:

> Taking a closer look at my HQL query, I realized it's checking if a
> category's ID is in the Categories collection.  So I tried to instead
> project the Categories collection into a collection of IDs:
>
> "from Item i left join fetch o.Categories cats where :cid in (select
> ID from elements(cats))"
>
> but that threw an exception:
>
> NHibernate.Hql.Ast.ANTLR.QuerySyntaxException occurred
>  Message=Exception of type 'Antlr.Runtime.MismatchedTokenException'
> was thrown. near line 1, column 124 [from MyApp.DomainModel.Item i
> left join fetch i.Categories cats where :cid in (select ID from
> elements(cats))]
>  Source=NHibernate
>  QueryString=from MyApp.DomainModel.Item i left join fetch
> i.Categories cats where :cid in (select ID from elements(cats))
>  StackTrace:
>       at NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException()
>       at NHibernate.Hql.Ast.ANTLR.HqlParseEngine.Parse()
>       at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Parse(Boolean
> isFilter)
>       at
> NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2
> replacements, Boolean shallow, String collectionRole)
>       at
> NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary`2
> replacements, Boolean shallow)
>       at NHibernate.Engine.Query.HQLQueryPlan..ctor(String hql,
> String collectionRole, Boolean shallow, IDictionary`2 enabledFilters,
> ISessionFactoryImplementor factory)
>       at NHibernate.Engine.Query.HQLQueryPlan..ctor(String hql,
> Boolean shallow, IDictionary`2 enabledFilters,
> ISessionFactoryImplementor factory)
>       at
> NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(String
> queryString, Boolean shallow, IDictionary`2 enabledFilters)
>       at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(String
> query, Boolean shallow)
>       at NHibernate.Impl.AbstractSessionImpl.CreateQuery(String
> queryString)
>
> In any case, I hope that someone can give me some tips on writing this
> HQL query.
>
>
> On Aug 8, 12:39 pm, HappyNomad <[email protected]> wrote:
> > I have a bidirectional many-to-many relationship between Category and
> > Item.  I'm trying to write an efficient query that, given a category's
> > ID, will initialize all items belonging to that category as well as
> > initialize each of those item's Categories collections.
> >
> > The HQL query I wrote is:
> >   "from Item i left join fetch i.Categories cats where :cid in
> > elements(cats)"
> >
> > I'm no HQL expert, so I should first ask: does this query looks okay?
> >
> > In any case, the resulting SQL is rather funky:
> >
> > select * where @p0 in (select category2_.CategoryID from eft outer
> > join Category_Item categories1_ on item0_.ID=categories1_.ItemID left
> > outer join Category category2_ on
> > categories1_.CategoryID=category2_.ID where
> >
> > For readability, I replaced some details in the SELECT clause with a
> > star.  I don't see what comes after the last "where" since Visual
> > Studio's exception dialog box (I think) cut it off.  Anyway, notice
> > that "left" is even spelled as "eft".  What happened here?
>

Reply via email to