2014-12-15 4 views
6

Voglio caricare i prodotti più venduti per quantità. Queste sono le mie tabelle:Come utilizzare un gruppo con Sum SQL con Spring Data JPA?

Product 
id name 
1 AA 
2 BB 

Productorder 
order_id product_id quantity 
1   1   10  
2   1   100  
3   2   15  
4   1   15  

Questa è la mia Primavera Data Repository:

@Repository 
public interface ProductRepository extends JpaRepository<Product, Long> { 

    @Query(value = "select top 5 p.name, sum(po.quantity) as total_quantity from product p " + 
      "inner join productorder po " + 
       "on p.id = po.product_id " + 
      "group by p.id, p.name " + 
      "order by total_quantity desc", nativeQuery = true) 
    List<Product> findTopFiveBestSeller(); 
} 

sto ottenendo HsqlException: Colonna non trovato: id

penso che questo errore non ha nulla fare con la colonna id, come è lì per entrambe le tabelle. Le query "raggruppa per Sum" funzionano con i dati di Spring? Perché mi sembra poco strano visto che Spring Data dovrebbe selezionare solo gli attributi del prodotto dal database e con questo sql selezioniamo anche la somma (po.quantità). I dati Spring possono gestirli e convertire il risultato in una lista?

PS: Sto usando HSQLDB incorporato come DB.

+3

In che modo una query che restituisce nomi e somme restituisce magicamente un elenco , poiché un prodotto ha un ID e un nome? La tua query non restituisce i prodotti, quindi il tipo restituito non dovrebbe essere Elenco

+3

L'errore probabilmente proviene dal gruppo, stai cercando di raggruppare per p.id ma non è nella tua lista di selezione. – JMK

+0

Spring ha DomainClassConverter, che converte da oggetti concreti ids. Almeno questo è quello che pensavo .. Ora l'ho cambiato in "seleziona i primi 5 p. *" Funziona ... Grazie! "select top 5 p.id" non funziona però. – akcasoy

risposta

4

Dopo aver modificato la proiezione di selezione dichiarazioni p.name-p.* per indicare che sto Selezione di più valori, piuttosto che semplici oggetti String che devono essere magicamente convertito in Product oggetti, questo funziona:

@Repository 
public interface ProductRepository extends JpaRepository<Product, Long> { 

    @Query(value = "select top 5 p.*, sum(po.quantity) as total_quantity from product p " + 
     "inner join productorder po " + 
      "on p.id = po.product_id " + 
     "group by p.id, p.name " + 
     "order by total_quantity desc", nativeQuery = true) 
    List<Product> findTopFiveBestSeller(); 

} 

Grazie @JMK und @JB Nizet.

+1

Ciao, Così hai creato la colonna total_quantity in Product bean? Ho bisogno di fare cose simili ... puoi elaborare quello che avevi a livello di bean. –

+0

può usare la quantità creando una classe esterna pojo – TanvirChowdhury

+0

@TanvirChowdhury quello che ho trovato è che devi almeno mappare la colonna usata nell'espressione SUM, in questo caso 'quantità' anche io non restituisco l'oggetto repository in questo caso . Funziona per me quando restituisco l'elenco , con ogni oggetto che rappresenta una colonna. – theBushman