How to fetch a many-to-many colletion?

43 views
Skip to first unread message

mynkow

unread,
Dec 16, 2011, 6:28:35 AM12/16/11
to nhu...@googlegroups.com
I have 3 tables, Groups, Users and Members. There are 2 entities, UserDto, GroupDto. I am trying to fetch/eager load the members if a group. The problem is that fetching is not working. What I am doing wrong?

MAPPING:
public class GroupDtoMap : DtoClassMap<GroupDto>
{
   
public GroupDtoMap()
   
{
       
Id(g => g.Id, "group_id");
       
HasManyToMany(g => g.Members) //  Members is a List<UserDto>
           
.Table("members")
           
.ParentKeyColumn("group_id")
           
.ChildKeyColumn("user_id");
   
}
}
QUERY:
var groups = ((DtoRepository<GroupDto>)repository).Session
                .CreateCriteria<GroupDto>("gr")
                    .Add(Expression.Eq("gr.IsActive", true))
                    .Add(Expression.IsNotNull("gr.Members.Id"))
                .SetFetchMode("gr.Members", NHibernate.FetchMode.Eager)
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .Future<GroupDto>();
TEST: here isfetched is false
var isFetched = NHibernateUtil.IsInitialized(groups.First().Members);

mynkow

unread,
Dec 16, 2011, 6:32:25 AM12/16/11
to nhu...@googlegroups.com
PS: I posted the wrong query. Here it is:

var groups = ((DtoRepository<GroupDto>)repository).Session
                .CreateCriteria<GroupDto>("gr")
                    .Add(Expression.Eq("gr.IsActive", true
))
                .CreateAlias("groups.Members", "member")
                    .Add(Expression.IsNotNull("member.Id"))
                .SetFetchMode("gr.Members", NHibernate.FetchMode.Eager)
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .Future<GroupDto>();

mynkow

unread,
Dec 16, 2011, 8:53:16 AM12/16/11
to nhu...@googlegroups.com
The same query with HQL has still property Members which is not initialized:

Session
                            .CreateQuery(@" select gr, member from GroupDto as gr
                                            inner join fetch Members as member
                                            where IsActive = true and member.Id != null ")
                            .SetResultTransformer(Transformers.DistinctRootEntity)
                            .Future<GroupDto>();

Itzik Saban

unread,
Dec 18, 2011, 3:23:03 AM12/18/11
to nhu...@googlegroups.com
if you're using NHibernate 3.1+, then you can use QueryOver:

Session.QueryOver<GroupDTO>()
            .Where(x => x.IsActive == true)
            .JoinQueryOver<MemberDTO>(x => x.Members, NHibernate.SqlCommand.JoinType.InnerJoin) //or left join
            .Where(x => x.Id != null)
            .TransformUsing(Transformers.DistinctRootEntity)
            .Future<GroupDTO>();

2011/12/16 mynkow <myn...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "nhusers" group.
To view this discussion on the web visit https://groups.google.com/d/msg/nhusers/-/uzulAPuJXxAJ.

To post to this group, send email to nhu...@googlegroups.com.
To unsubscribe from this group, send email to nhusers+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.


--
Itzik Saban


mynkow

unread,
Dec 19, 2011, 5:16:37 PM12/19/11
to nhu...@googlegroups.com
Same result. The members collection is not initialized.
Reply all
Reply to author
Forward
0 new messages