2014-12-15 21 views
6

Tôi muốn tải các sản phẩm bán chạy nhất theo số lượng. Đây là bảng của tôi:Làm thế nào để sử dụng một nhóm bằng Sum SQL với JPA dữ liệu mùa xuân?

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  

Đây là mùa xuân của tôi liệu 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(); 
} 

Tôi nhận HsqlException: Cột không tìm thấy: id

Tôi nghĩ rằng lỗi này không có bất cứ điều gì để làm với cột id, vì nó ở đó cho cả hai bảng. Làm "nhóm theo Tổng truy vấn" làm việc với dữ liệu Spring? Bởi vì có vẻ hơi lạ đối với tôi vì Spring Data chỉ nên chọn các thuộc tính sản phẩm từ cơ sở dữ liệu, và với sql này, chúng tôi cũng chọn tổng (po.quantity). Dữ liệu Spring có thể xử lý điều này và chuyển đổi kết quả thành một List không?

PS: Tôi đang sử dụng HSQLDB được nhúng dưới dạng DB.

+3

Làm cách nào để truy vấn trả về tên và số tiền kỳ diệu trả về Danh sách , vì Sản phẩm có ID và tên? Truy vấn của bạn không trả về sản phẩm, vì vậy loại trả về không được liệt kê

+3

Lỗi này có khả năng đến từ nhóm, bạn đang cố gắng nhóm theo p.id nhưng không có trong danh sách lựa chọn của bạn. – JMK

+0

Mùa xuân có DomainClassConverter, chuyển đổi từ các đối tượng cụ thể. Ít nhất đó là những gì tôi nghĩ .. Bây giờ tôi đã thay đổi nó thành "chọn top 5 p *" nó hoạt động ... Cảm ơn! "chọn top 5 p.id" không hoạt động. – akcasoy

Trả lời

4

Sau khi thay đổi các câu SELECT chiếu p.name-p.* để cho biết rằng tôi đang chọn nhiều giá trị hơn là chỉ đối tượng String mà phải được chuyển đổi sang kỳ diệu Product đối tượng, công trình này:

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

} 

Cảm ơn @JMK und @JB Nizet.

+1

Xin chào, Vì vậy, bạn đã tạo cột total_quantity trong Product bean? Tôi cần phải làm những thứ tương tự .. bạn có thể xây dựng những gì bạn đã có trong cấp độ đậu của bạn. –

+0

anh ta có thể sử dụng số lượng bằng cách tạo ra một lớp pojo bên ngoài – TanvirChowdhury

+0

@TanvirChowdhury những gì tôi thấy là ít nhất bạn phải ánh xạ cột được sử dụng trong biểu thức SUM, trong trường hợp này, 'quantity' Tôi cũng không trả về đối tượng kho lưu trữ trong trường hợp này . Nó hoạt động cho tôi khi trả về Danh sách , với mỗi đối tượng đại diện cho một cột. – theBushman

Các vấn đề liên quan