關於Spring Data Jpa的分頁 跨表查詢

2021-08-21 19:53:51 字數 1724 閱讀 8038

jqa的query使用原生sql查詢(nativequery = true)的時候不支援排序的,需要在sql裡面加上:order by ?#

spring data jpa本地查詢(帶分頁方式)

@query(value = "select u.* from

user u inner

join project_user pu " +

"on pu.project_id=?1

and pu.user_id=u.user_id order

by ?#",

countquery = "

select

count(*) from

user u inner

join project_user pu " +

"on pu.project_id=?1

and pu.user_id=u.user_id",

nativequery = true)

pagefindbyprojectid(string projectid, pageable pageable);

注意:

countquery中不要寫成:

「select count(u.*) from user u inner join project_user pu on pu.project_id=?1 and pu.user_id=u.user_id」

count(u.*)會報錯,應該寫為count(*)

order by ?#用於 pageable. countquery 用於page<>。

dmitry stolbov回答

如果不寫countquery,那麼jpa會預設在select的引數上加count,例如上面例子就會成為 select (u.*) …

這樣就會報錯。所以應該寫出自定義的countquery

jparepository中的介面方法返回型別只能是實體類或者object(值作為字串列表返回,沒有key),如果這時想要通過跨表連線查詢,返回乙個非實體類的dto,就會報錯。

利用hql可以輕鬆解決。例如:

@query(

value = "select new com.test.dto.getprojectuserdto(u.userid, u.name, u.displayname, r.name, pu.description) from

user u, projectuser pu, role r " +

"where pu.projectid=?1

and pu.userid=u.userid and pu.roleid=r.id",

countquery = "

select

count(*) from

user u, projectuser pu, role r " +

"where pu.projectid=?1

and pu.userid=u.userid and pu.roleid=r.id")

pagefindbyprojectid(string projectid, pageable pageable);

注意:

關於Spring Data Jpa 動態查詢

通常來說 的後台管理系統對於資料的查詢需要提供多種查詢條件,並且要求在使用者任意的選擇條件進行查詢 這種情況下後端需要通過不同的條件組合對資料庫進行查詢,mybatis的標籤能夠很好地實現這個功能 只需要在if標籤中對引數進行判空,非空則拼接where 條件即可。但是對於spring data jp...

spring data jpa實體繼承

spring jpa中我們要將sql對映到物件,尤其是在spring boot這種高度自動化的環境下使用,大量的最優目錄結構與命名規則可以大大降低配置,約定大於配置貫穿其中。例如我們定義查詢dao,繼承jparepository即可。然後返回的物件,我們可以定義model entity table ...

SpringData JPA分頁查詢

首先我們需要知道springdata jpa 的幾個介面 其實看名字就大概懂了,也可以很方便的使用 首先我們的持久化層繼承jparepository,相當於繼承了增刪改查的持久化層以及分頁查詢的持久化層 所以如果我們要使用分頁查詢 我們只需要直接呼叫 由一開始的圖也可以看到pageable的其中乙個...