簡體   English   中英

快速的JPA查詢,但映射到實體的速度較慢

[英]Fast JPA Query but slow mapping to entity

由於使用Hibernate JPA時從實體中獲取大約30k結果的性能問題,我改為嘗試編寫namedQuery以更好地控制查詢及其運行時間。 我最終得到的只是這幾個實體將近20秒,而那20秒對於“舊”查詢和我自己的namedQuery是必需的(在sql客戶端中執行時不需要一秒鍾即可得到結果) ,因此基本上無論我使用namedQuery還是hibernate生成的查詢都沒有任何區別。

是否可以安全地假設將98%的時間用於將那些結果映射到其對應的實體? 如果是這樣,我應該如何加快速度? 以下是我編寫的查詢(請注意,我必須明確聲明SELECT中的所有列)

SELECT exp.ID
  ,exp.CREATEDBY
  ,exp.CREATEDTIME
  ,exp.DELETED
  ,exp.LASTCHANGE
  ,exp.LASTCHANGEBY
  ,exp.STATUS
  ,exp.BRIXFIGURE
  ,exp.GRAMMAGE
  ,exp.INDIVIDUALPACKAGING
  ,exp.MINORDERQUANTITY
  ,exp.PACKAGINGHEIGHT
  ,exp.PACKAGINGLENGTH
  ,exp.PACKAGINGWIDTH
  ,exp.PALETTESIZE
  ,exp.QUANTITY
  ,exp.UNIT
  ,exp.VALIDUNTIL
  ,exp.EXPORTELEMENT_START
  ,exp.EXPORTSTATUS
  ,exp.webServiceResponse
  ,exp.CATEGORYID
  ,exp.COMMENTID
  ,exp.SUPPLIERID
  ,exp.TRANSPORTPACKAGINGID
  ,exp.LocationId
  ,exp.PriceRowId
  ,exp.EXPORTELEMENT_ENDDATE
  ,exp.BASEPRICE
  ,exp.BASEUNIT
  ,exp.BARCODES
  ,exp.EXPIRYDATE
  ,exp.PREORDERPERIOD
  ,exp.EXPORTWEEKID
  ,exp.EXPORT_TENDER_UID
  ,exp.EXPORT_UID
  ,exp.CURRENCY_ID
  ,exp.WEIGHT_PER_BOX
  FROM EXPORTELEMENT AS exp
  JOIN EXPORTELEMENT_LOCATION as exlo ON exlo.EXPORTELEMENTID = exp.ID
  WHERE exlo.LOCATIONID = :locationId
  AND exp.EXPORTELEMENT_ENDDATE <= :endDate
  AND exp.EXPORTELEMENT_START >= :startDate
  AND exp.DELETED = :deleted

編寫原始sql與讓hibernate / jpa為您完成操作並不能提高性能。 原因可能是您的對象映射到其他對象(映射到其他對象,而不是懶惰)(因此,渴望獲取),因此您可能會提取整個數據庫。 您可能會認為查詢是唯一要執行的查詢,但現實是其他映射可能正在創建/執行更多的sql查詢...以我為例,對於10,000行執行映射的過程自己花費了100毫秒,但讓hibernate / jpa進行了映射花費了10秒,是整個100倍。

提高性能的是自己進行映射。 像這樣:

@Query(nativeQuery = true, value = "your_raw_sql_here")
List<Object[]> yourNativeQueryMethod();

然后,您可以自己映射對象:

for( Object[] objectArray: results) {
    BigInteger id = (BigInteger) objectArray[0];
    //etc...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM