2011-11-29 12 views
8

Supongamos que tengo una tabla Persona y quiero contar todas las personas cuya "fecha de nacimiento" no es nula y son un estudiante. Suponiendo que tengo dos columnas:filas de recuento de hibernación con algunos criterios

birthDate Date (can be null) 
isStudent boolean (default: false) 

¿cómo puedo hacer esto usando Hibernate ..?

+1

¿Qué has intentado? Esta es una consulta básica. ¿Has leído la documentación de Hibernate? http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/queryhql.html –

Respuesta

28
Criteria crit = session.createCriteria(Person.class); 
crit.add(Restrictions.isNotNull("birthDate")); 
crit.add(Restrictions.eq("isStudent", true)); 
crit.setProjection(Projections.rowCount()); 
Integer count = (Integer)crit.uniqueResult(); 
+0

¿Qué pasa si también quiere ver el recuento de isDropout en la misma consulta? – Stephane

+1

Si desea dos recuentos independientes, deberá usar una unión o una subconsulta y, por lo tanto, un alias en hibernación. Porque necesita agrupar en criterios específicos – Lawrence

13
Criteria crit = session.createCriteria(Person.class); 
crit.add(Restrictions.isNotNull("birthDate")); 
crit.add(Restrictions.eq("isStudent", true)); 
List<Person> students = crit.list(); 
Integer count = students.size(); 

o si sólo quiere un solo valor de cuenta, y no hay lista devuelta:

Criteria crit = session.createCriteria(Person.class); 
crit.setProjection(Projections.rowCount()); 
crit.add(Restrictions.isNotNull("birthDate")); 
crit.add(Restrictions.eq("isStudent", true)); 
return (Long) crit.uniqueResult(); 
+1

¿Estás buscando la lista completa solo para conocer su tamaño? ¿Por qué usar Criteria cuando una consulta HQL básica es suficiente? –

+0

@JB Nizet porque probablemente estaría usando la lista también para otras lógicas – NimChimpsky

+4

Prefiero los criterios sobre las cadenas concatenantes, un poco vence el propósito de hibernar si escribe sql como una cadena, imho. – NimChimpsky

3
Number count = (Number) session.createQuery(
    "select count(p.id) from Person p" 
    + " where p.birthDate is not null and p.isStudent = true").uniqueResult(); 
0

usarlo. Está funcionando

public class IncIncidentListGridModel 
{ 

    private String historyStatus = null; 

    public String getHistoryStatus() 
    { 
     return historyStatus; 
    } 

    public void setHistoryStatus(String historyStatus) 
    { 
     this.historyStatus = historyStatus; 
    } 

    public void run() 
    { 
     IncIncidentListGridModel resultCount = 
      (IncIncidentListGridModel) ((SQLQuery) hibersession 
       .createSQLQuery("select count(ch.incident_capa_history_id) as historyStatus from incident_capa_history ch, incident_capa ic where ic.incident_capa_id = ch.FK_incident_capa_id and ic.incident_capa_id='011'")) 
       .addScalar("historyStatus", Hibernate.STRING) 
       .setResultTransformer(
        Transformers.aliasToBean(IncIncidentListGridModel.class)) 
       .uniqueResult(); 

     System.out.println("count result" + resultCount.getHistoryStatus()); 
    } 
} 
+1

Formatee la respuesta correctamente, no solo partes de la respuesta. – konqi

+1

"Úselo. Está funcionando" no es un comentario útil. ¿Por qué alguien asumiría que una respuesta publicada no funcionaría? –

1
int result= (int)((long)session.createQuery("select count(p) from User p where p.mobileNumber = :pMobileNumber") 
       .setParameter("pMobileNumber", mobileNumber).uniqueResult()); 
Cuestiones relacionadas