代码之家  ›  专栏  ›  技术社区  ›  sh_kamalh

NHibernate左外连接无关实体

  •  2
  • sh_kamalh  · 技术社区  · 14 年前

    我有两个实体角色和翻译。
    角色->角色ID,代码
    翻译->代码、语言、名称


    例如:
    角色(1,'Rol\u 001')可以具有以下关系:Translation('Rol\u 001','English','')&Translation('Rol\u 001','French','')。

    我想用HQL表达以下SQL查询:

    
    select r.Role_ID, t.Name
    from Role r left outer join Translation t 
       on r.Code = t.Code and t.Language = @lang;
    

    在我的映射文件中,这两个实体之间没有任何关系,但是下面的HQL查询就像内部连接一样工作

    
    IQuery query = session.CreateQuery("select new Lookup(r.Role, t.Name) from Role r, Translation t where r.Code = r.Code and t.Language = :language");
    

    你能帮我做以下事情吗

    2-如果我可以保持映射文件的原样,如何在HQL中编写这样的查询?

    编辑:
    现在我使用以下基于建议的代码来使用CreateSQL:

    
    ISQLQuery query = session.CreateSQLQuery("select m.MedicineTypeID, t.Name, m.IsDeleted from MedicineType m left outer join Translation t on m.Code = t.Code and t.Language = :language");
    query.SetString("language", language);
    IList rawLookup = query.List();
    
    IList medicineTypesLookup = new List(rawLookup.Count);
    foreach (object[] lookup in rawLookup)
    {
        medicineTypesLookup.Add(new Lookup((int)lookup[0], (string)lookup[1], (bool)lookup[2]));
    }
    return medicineTypesLookup;
    


    query.AddEntity(typeof(Lookup)); 但我有个例外 NHibernate.MappingException: No persister for: DAL.Domain.Lookup .
    查找只是一个POCO,不映射到任何数据库表。它的映射文件 <import class="Lookup" />

    2 回复  |  直到 14 年前
        1
  •  2
  •   EdgeCaseBerg    11 年前

    最后我找到了答案:

    ISession session = NHibernateHelper.Session;
    ISQLQuery query = session.CreateSQLQuery("select m.MedicineTypeID as ID, t.Name, m.IsDeleted from MedicineType m left outer join Translation t on m.Code = t.Code and t.Language = :language");
    query.setString("language", language);
    IList lookup = query.SetResultTransformer(Transformers.AliasToBean()).List();
    return lookup;
    
    查找是一个POCO类,它有一个无参数构造函数和3个属性ID、Name和IsDeleted。

    编辑: http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/impl/SQLQueryImpl.html setString()

        2
  •  1
  •   Kelly    14 年前

    必须在映射中定义关系或执行子查询