Come selezionare più colonne utilizzando la somma di proiezione con group by in modalità di Ibernazione

Mio MySQL query è:

SELECT 
    c.first_name, 
    c.middle_name, 
    c.last_name, 
    s.ticker, 
    COUNT(s.ticker), 
    SUM(t.cumulative_qty), 
    SUM(cumulative_balance)
FROM client_master c, security s, transaction_master t 
WHERE c.id = t. client_master_id AND s.id = t.security_id AND t.client_master_id = 4 
GROUP BY t.security_id;

Questa query restituisce un risultato esatto. Voglio scrivere di Sospensione Criteri che corrisponde a un risultato. Questo è quello che ho provato:

Criteria criteria = createEntityCriteria(TransactionDetails.class, "tr")
                .createAlias("tr.client", "cl")
                .createAlias("tr.security", "se")
                .add(Restrictions.eq("cl.id", clientId))
                .setProjection(Projections.sum("tr.cumulativeQty"))
                .setProjection(Projections.groupProperty("tr.securityId"));

return  criteria.list();

Ma questo criterio è la restituzione solo un List di tr.securityId. Voglio tutte le righe. Dove sto andando di male?

InformationsquelleAutor Satish N | 2014-08-18

 

2 Replies
  1. 5

    Non si può fare setProjection() più volte. È necessario creare un ProjectionList prima e quindi impostare ogni proiezione. È necessario specificare i criteri che campi hai bisogno del resultset specificandoli in Projections.property() .

    Provare questo:

    ProjectionList projList = Projections.projectionList();
    projList.add(Projections.sum("tr.cumulativeQty"));
    projList.add(Projections.groupProperty("tr.securityId"));
    
    projList.add(Projections.property("firstName"));
    projList.add(Projections.property("lastName"));
    //add other fields you need in the projection list
    
    Criteria criteria = createEntityCriteria(TransactionDetails.class, "tr")
                    .createAlias("tr.client", "cl")
                    .createAlias("tr.security", "se")
                    .add(Restrictions.eq("cl.id", clientId))
                    .setProjection(projList);
    • Grazie per la soluzione, ho fatto le modifiche suggerite da voi, ma solo la restituzione di Somma e securityId Elenco invece di questo, io voglio tutte le colonne e.g ( first_name, c.middle_name, c.cognome, s.teleborsa). Si prega di Suggerire le modifiche.
    • Ho appena aggiornato la risposta, è necessario utilizzare le Proiezioni.proprietà(“propertyName”) per selezionare tutte le proprietà.
    • Ho appena aggiunto due proprietà, aggiungere il resto
    • il Suo Lavoro . Grazie Per la Soluzione.
  2. 0

    Inoltre, Si potrebbe utilizzare più la proiezione inline di criteri. Come di seguito.

    Criteria criteria = createEntityCriteria(SomeClass.class)
               .createAlias(...some elias...)
               .add(Restrictions..... etc)
               .setProjection(
                   Projections.projectionList()
                      .add(Projections.groupProperty("someProp1"))
                      .add(Projections.property("someProp2"))
                      .add(Projections.sum("someProp3"))
               );

Lascia un commento