0
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;}
}

最終的に私が探しているクエリは

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%'

私が試している基準は、結果としてabcdtoオブジェクトを取得できるように、基準を作成するための最良の方法を教えてください

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>();
4

1 に答える 1

1

クラスとマッピングでオブジェクト間の関係を定義しないと、NHibernate でオブジェクトを結合することはできません。

したがって、あなたの例を取り上げると、次のクラス定義を推定できます。

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;}
}

基準クエリは次のようになります。

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>();

Criteria Query で null 参照を処理する方法に応じて、Inner または Left Joins をオプションで選択できます。

于 2011-06-30T13:37:03.890 に答える