1. 程式人生 > >Spring Data Jpa多表聯合分頁查詢

Spring Data Jpa多表聯合分頁查詢

參考:https://blog.csdn.net/qq_36144258/article/details/80298354

近期一個專案用到Spring Data Jpa,Jpa用來做單表查詢非常的簡單粗暴,可以說不用寫sql,但是涉及到複雜的多表操作,還是要寫sql,這個時候需要用到@Query註解。@Query用法可見https://mp.csdn.net/postedit/82797015 

@Query(value = "select new com.squid.service.dto.MyFriendDTO(uil.createdTime as inviteTime,ui.nickname as name,ui.grade as grade) from UserInviteLog as uil left join UserInfo as ui on uil.userId = ui.id where uil.inviteUserId = :userId and ui.grade > :grade",
            countQuery = "select count(uil.id) from UserInviteLog as uil left join UserInfo as ui on uil.userId = ui.id where uil.inviteUserId = :userId and ui.grade > :grade")
    Page<MyFriendDTO> findElitedByInviteUserId(@Param("userId")Long userId, @Param("grade")Integer grade, Pageable pageable);

com.squid.service.dto.MyFriendDTO是需要返回的實體類相當於我們XML中的resultMap,這個地方需要注意的是,一定要重寫返回的實體類的構造方法(具體引數根據new建立的引數設定,這裡是三參inviteTime、name、grade),否則將new失敗。

public MyFriendDTO(Long inviteTime, String name, Integer grade) {
        this.inviteTime = inviteTime;
        this.name = name;
        this.grade = grade;
    }

也可以不返回具體實體類直接返回List<Map<String, Object>>不過分頁就不好處理了。

countQuery就是為了配合Page計算總條數的。

分頁入參Pageable,我們和單表分頁一樣直接丟進去,springdata會幫我們處理好。