2010-03-22 50 views
4

這是我的映射文件數:NHibernate的 - 檢索特定的列和使用條件查詢

class name="CRMStradCommon.Entities.OportunidadEntity,CRMStradCommon" table="oportunidad"> 

    <id name="Id" column="id" type="int"> 
     <generator class="native" /> 
    </id> 
    <property name="Titulo" column="titulo" type="string" not-null="true" /> 
    <many-to-one name="Estado" column="estado" class="CRMStradCommon.Entities.EstadoOportunidadEntity,CRMStradCommon" /> 
    <many-to-one name="Dueno" column="dueno" class="CRMStradCommon.Entities.ContactoEntity,CRMStradCommon" /> 
    <property name="FechaCierreEstimado" column="fecha_cierre_estimado" type="DateTime" not-null="false"/> 
    <property name="FechaVencimiento" column="fecha_vencimiento" type="DateTime" not-null="false"/> 
</class> 

這是其他與連接子類

class name="CRMStradCommon.Entities.ContactoEntity,CRMStradCommon" table="contacto" dynamic-update="true"> 
    <id name="Id" column="id" type="int"> 
     <generator class="native" /> 
    </id> 
    <property name="Nombre" column="nombre" type="string" not-null="true" /> 
    <property name="Email1" column="email1" type="string" /> 
    <property name="Email2" column="email2" type="string" /> 
    <property name="Web1" column="web1" type="string" /> 
    <property name="Web2" column="web2" type="string" /> 
    <bag name="DuenoOportunidadList" lazy="true" inverse="true"> 
     <key column="dueno"/> 
     <one-to-many class="CRMStradCommon.Entities.OportunidadEntity,CRMStradCommon"/> 
    </bag> 
    <joined-subclass name="CRMStradCommon.Entities.EmpresaEntity,CRMStradCommon" table="empresa" lazy="false"> 
     <key column="id" /> 
     <many-to-one name="Categoria" column="categoria" class="CRMStradCommon.Entities.CategoriaEmpresaEntity,CRMStradCommon" /> 
     <many-to-one name="Calificacion" column="calificacion" class="CRMStradCommon.Entities.CalificacionEmpresaEntity,CRMStradCommon" /> 
    </joined-subclass> 
    <joined-subclass name="CRMStradCommon.Entities.PersonaEntity,CRMStradCommon" table="persona" lazy="false"> 
     <key column="id" /> 
     <property name="Saludo" column="saludo" type="string" /> 
     <property name="Apellido" column="apellido" type="string" /> 
     <property name="SegundoNombre" column="segundo_nombre" type="string" /> 
    </joined-subclass> 
</class> 

我怎樣才能讓這個查詢與標準是什麼?

SELECT  
    contacto.id, contacto.nombre, persona.apellido, COUNT(*) AS Cant 
FROM   
    contacto 
INNER JOIN 
    oportunidad ON contacto.id = oportunidad.dueno 
LEFT OUTER JOIN 
    persona ON contacto.id = persona.id 
LEFT OUTER JOIN 
    empresa ON contacto.id = empresa.id 
GROUP BY 
    contacto.id, contacto.nombre, persona.apellido 
ORDER BY 
    contacto.nombre, persona.apellido 

非常感謝!

非常感謝!它解決了我的問題的一部分。我這樣做:

ICriteria criteria = session.CreateCriteria(typeof(ContactoEntity)); 
criteria.SetProjection(Projections.ProjectionList() 
        .Add(Projections.GroupProperty("Id"),"Id") 
        .Add(Projections.GroupProperty("Nombre"),"Nombre") 
        .Add(Projections.GroupProperty("Apellido"), "Apellido") 
        .Add(Projections.GroupProperty("TipoContacto"), "TipoContacto") 
        .Add(Projections.RowCount(),"CantOportunidadesDueno")); 
criteria.CreateCriteria("DuenoOportunidadList"); 
criteria.AddOrder(Order.Asc("Nombre")).AddOrder(Order.Asc("Apellido")); 
criteria.SetResultTransformer(
        new NHibernate.Transform.AliasToBeanResultTransformer(typeof(ContactoEntity))); 

IList<ContactoEntity> ContLst = (criteria.List<ContactoEntity>()); 

我爲了讓Contacto實體的集合中使用的變壓器,但問題是財產Apellido。我在Persona的子類中使用它,集合僅由父類創建,而不是由子類創建。

你知道是否有可能解決這個問題嗎?或者我唯一的解決方案是扔掉每個收集物品,而不使用變形器,並創建一個新的收集實體創建每個新的對象?

謝謝!

回答

1

您想使用投影。事情是這樣的:

session.createCriteria(ContactoEntity.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.groupProperty("id") 
    .add(Projections.groupProperty("nombre") 
    .add(Projections.groupProperty("apellido") 
    .add(Projections.rowCount())); 

更新 - 我只注意到你正在使用NHibernate的,我就是一個Java的用戶,這樣的代碼片段我給可能需要進行調整供您使用。希望能幫助到你。