2011-11-29 11 views
8

Supponiamo di avere una tabella Persona e voglio contare tutte quelle persone il cui "data di nascita" non è nullo e sono uno studente. Supponendo che ho due colonne:Hibernate conta righe con alcuni criteri

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

Come posso fare questo usando Hibernate ..?

+1

Che cosa hai provato? Questa è una query di base. Hai letto la documentazione di Hibernate? http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/queryhql.html –

risposta

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

E se volesse anche vedere il conteggio di isDropout nella stessa query? – Stephane

+1

Se si desiderano due conteggi indipendenti, è necessario utilizzare una unione o una sottoquery e quindi alcuni alias in modalità di sospensione. Perché è necessario raggruppare su criteri specifici – 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 se vogliono solo un singolo valore di conteggio, e nessun elenco restituito:

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

Stai recuperando l'intero elenco solo per conoscerne le dimensioni? Perché utilizzare i criteri quando è sufficiente una query HQL di base? –

+0

@JB Nizet perché probabilmente userei l'elenco anche per altre logiche – NimChimpsky

+4

Preferisco i criteri sulla concatenazione di stringhe, un po 'sconfigge lo scopo di ibernare se si scrive sql come stringa, 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. Sta funzionando

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

Si prega di formattare correttamente la risposta, non solo parti della risposta. – konqi

+1

"Usalo. Sta funzionando" non è un commento utile. Perché qualcuno dovrebbe presumere che una risposta pubblicata non avrebbe funzionato? –

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