2010-03-22 8 views
4

Ceci est mon fichier de mapping:NHibernate - Récupérer des colonnes spécifiques et compte en utilisant des critères requête

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> 

Ceci est l'autre joint-sous-classe

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> 

Comment puis-je faire cette requête avec des critères?

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 

Merci beaucoup!

Merci beaucoup! Cela a résolu une partie de mon problème. Je l'ai fait:

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

je transformateur afin de faire une collection de Contacto entités, mais le problème est la propriété Apellido. Je l'ai dans la sous-classe Persona et la collection est faite uniquement avec la classe parente et non avec les classes enfants. Savez-vous s'il est possible de résoudre ce problème?

ou la seule solution que j'ai est d'aller jeter chaque élément de collection sans utiliser de transformateur et de créer une nouvelle collection d'entités Contacto créant chaque nouvel objet?

Merci !!!

Répondre

1

Vous souhaitez utiliser des projections. Quelque chose comme ceci:

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

MISE À JOUR - Je viens de remarquer que vous utilisez NHibernate, et je suis un utilisateur Java si l'extrait de code que j'ai donné peut-être besoin d'être peaufiné pour votre usage. J'espère que cela aide.

Questions connexes