2014-12-22 18 views
0

直到今天我用的是這樣一句話:春數據JPA庫返回Object [],而不是MyType的同時使用和函數

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

這裏,我將返回類型定義爲產品的列表,我究竟得到了什麼我需要。所選列total_quantity簡單地被忽略。

最後,我需要將分頁整合到此查詢中。由於Spring不支持使用原生查詢進行分頁處理,因此我想先將此查詢轉換爲JPQL(然後我將添加分頁)。現在它看起來像這樣:現在

@Query(value = "select p, sum(po.quantity) as total_quantity " + 
     "from Product p, ProductOrder po " + 
     "where p.id = po.pk.product " + 
     "group by p.id, p.name " + 
     "order by total_quantity desc") 
List<Product> findTopFiveBestSeller(); 

返回類型是對象陣列的列表,其中陣列的第一個元素是產品,並且第二個是total_quantity。 (雖然方法簽名說明列表..)

我該如何更改我的語句或以某種方式實現此目的,以便我不必處理數組,並且只需獲取我的Product對象?

編輯:我有這個想法使用這個查詢作爲子查詢,並從子查詢中選擇產品。事實證明JPQL不能在'from'子句中執行子查詢。

+0

我會簡單地替代「產品」與「對象」。對象會處理我思想中的一切。 – pmverma

+0

並非如此簡單。首先它是一個對象數組。所以我必須迭代對象[]的列表,並獲取第一個元素,將其轉換爲Product,放入一個新列表中,以便將其用作產品列表。其次,當我傳遞可分頁屬性這是我的實際目標),返回類型是Page。所以我必須遍歷頁面中的對象數組,再次獲取第一個元素,最後我必須初始化自己的頁面,分別指定每個彈簧頁面的屬性(大小,排序,方向等),以便在最後我可以有一個頁面,我可以無縫地使用 – akcasoy

回答

0

事實上,您的查詢不僅僅返回構建Product對象所需的列,因此Spring JPA將它映射到一個對象。

創建擴展產品的聚集實體,並且包含屬性totalQuantity和您的查詢映射到它(可能在另一個倉庫)

+0

我的第一個查詢(本機一)也沒有返回只需要建立一個產品對象的列,但同一個Spring JPA映射到一個對象(產品)...這種行爲僅僅是針對JPQL的嗎? – akcasoy

+0

akcasoy。請看這個 - http://cfmtips.blogspot.com/2016/08/spring-jpa-repository-hibernate.html。希望它能幫助你... – Shamseer

相關問題