項目里用到JPA關系映射,導致一個普通的查詢方法會執行數十條sql,使用懶加載的方式解決。當時配置過懶加載之后,還是失效 會執行sql 於是反復試驗 排查得出一些結論。
第一次我的代碼是這樣的,感覺應該沒有問題。但是每次執行到打斷點這一行,會執行關聯查詢的sql。
坑!坑!坑!這里有坑請注意 最后排查發現是因為我的實體類用了lombok的@Data注解導致的。單獨使用@Getter 和 @Setter方法就可以了。
我還測試了第二種方法,直接返回實體類對象,但是才開始會報一個cast錯誤 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 錯誤 大意就是 數據類型轉換失敗,懶加載的字段查出來並不為null而是一個叫hibernateLazyInitializer的東西 於是百度到@JsonIgnoreProperties(value = { "hibernateLazyInitializer"}) 這樣的寫法 雖然不報錯了 但是return 的時候還是會去執行sql,只有把這個字段@JsonIgnore才正常
注意 不加@JsonIgnore就必須加@JsonIgnoreProperties(value = { "hibernateLazyInitializer"}) 否則JPA直接輸出就會報錯
1. 所以總結出兩種用法,第一種就是查出來之后 利用VO封裝,但是注意實體類不能用lombok的@Data及以上的注解。
2. 直接返回實體類,但是需要把lazy字段 忽略掉 才可以,如果其他時候要用到 需要繼續封裝VO賦值才可以。
僅作為個人經驗總結,歡迎指教。