Vamsi
Vamsi

Reputation: 95

NHibernate Criteria

public class A
{    
public string aname {get; set;}
public string aId {get; set;}                                                
public string bId {get; set;}
}

public class B 
{    
public string bId {get; set;}                                                
public string bname {get; set;}                                                  
public string cId {get; set;}
}

public class C 
{                                                                                
public string cId {get; set;}
public string cfirstname {get; set;}    
public string clastname {get; set;}
}

public class abcDTO
{
public string aname {get; set;}
public string bname {get; set;} 
public string clastname {get; set;}
}

Evetually the query which I am looking is

SELECT a.aid, b.bname, c.clastname FROM A thisa 
inner join B thisb on thisa.bid=thisb.bid
inner join C thisc  on thisb.cid=thisc.cid and this_.POLICY_SEARCH_NBR like '%-996654%'

The criteria which I am trying is, Please let me know the best possible way to write a criteria so that I can get the abcdto object as result

var policyInsuranceBusiness = DetachedCriteria.For<A>()
                .SetProjection(Projections.Property("a.aid"))
                .Add(Restrictions.Like("a.aid", "1-SAP-3-996654", MatchMode.Anywhere))
                .CreateCriteria("b.bid", "b", JoinType.InnerJoin) 
                .SetProjection(Projections.Property("b.bname")) // ERROR OUT - COULD NOT RESOLVE PROPERTY
                .CreateCriteria("c.cid", "c", JoinType.InnerJoin)
                .SetProjection(Projections.Property("c.clastname")); // ERROR - COULD NOT RESOLVE PROPERTY

IList<abcDTO> plo = policyInsuranceBusiness.GetExecutableCriteria(_session).SetResultTransformer(NHibernate.Transform.Transformers
                .AliasToBean<abcDTO).List<abcDTO>();

Upvotes: 0

Views: 1847

Answers (1)

Mark Perry
Mark Perry

Reputation: 1725

You can't join objects in NHibernate without having a relationship between them defined in the classes and in the mappings.

So taking your example I would estimate the following class definitions:

public class A {    
    public virtual string Name {get; set;}
    public virtual string PolicySearchNumber {get; set;}
    public virtual int Id {get; set;}                                                
    public virtual B B {get; set;}
}

public class B {    
    public virtual int Id {get; set;}                                                
    public virtual string Name {get; set;}                                                  
    public virtual C C {get; set;}
}

public class C {                                                                                
    public virtual int Id {get; set;}
    public virtual string Firstname {get; set;}    
    public virtual string Lastname {get; set;}
}

public class abcDTO {
    public string int aid {get; set;}
    public string aname {get; set;}
    public string bname {get; set;} 
    public string clastname {get; set;}
}

And your Criteria Query would be:

var results = session.CreateCriteria<A>()
    .CreateCriteria("B", "b")
    .CreateCriteria("b.C", "c")
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Id"), "aid")
        .Add(Projections.Property("Name"), "aname")
        .Add(Projections.Property("b.Name"), "bname")
        .Add(Projections.Property("c.Lastname"), "clastname")
    )
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(abcDTO)))
    .List<abcDTO>();

You can optionally choose Inner or Left Joins depending on how you handle null references in the Criteria Query.

Upvotes: 1

Related Questions