我使用spring-data-jpa (2.1.7.RELEASE)休眠(5.6.9.Final)作為 ORM 實作。
我Pageable在服務層創建物件并將其傳遞給回購層 -
服務層代碼:
Pageable pg = PageRequest.of(4, 2);
Page<Tuple> packagesList = packageRepository.getPackageByAccountIdAndPackageId(accountId, packageId, pg);
存盤層代碼:
public interface PackageRepository extends JpaRepository<Packages, PackageId> { ...
和
@Query(value = "SELECT p.package_id FROM packages p WHERE p.account_id=:accountId AND (CASE WHEN :packageId IS NULL THEN TRUE WHEN p.package_id LIKE :packageId THEN TRUE ELSE FALSE END)",
countQuery = "SELECT count(*) FROM packages", nativeQuery = true)
Page<Tuple> getPackageByAccountIdAndPackageId(String accountId, String packageId, Pageable pg);
在生成的 SQL 中 -limit添加了限制,但沒有生成系結值。下面應該澄清 -
查詢和系結引數
Hibernate:
SELECT
p.package_id
FROM
packages p
WHERE
p.account_id=?
AND (
CASE
WHEN ? IS NULL THEN TRUE
WHEN p.package_id LIKE ? THEN TRUE
ELSE FALSE
END
) limit ?, ?
2022-10-15 18:43:46.285 TRACE 68021 --- [nio-8095-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [40955353-d2c3-4377-8c95-6b403b7570ef]
2022-10-15 18:43:46.286 TRACE 68021 --- [nio-8095-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [VARCHAR] - [%2]
2022-10-15 18:43:46.286 TRACE 68021 --- [nio-8095-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [%2]
2022-10-15 18:43:46.328 TRACE 68021 --- [nio-8095-exec-1] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@41baa13] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@7317fb] bound to thread [http-nio-8095-exec-1]
2022-10-15 18:43:46.329 TRACE 68021 --- [nio-8095-exec-1] .s.t.s.TransactionSynchronizationManager : Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@41baa13] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@7317fb] bound to thread [http-nio-8095-exec-1]
為什么即使查詢需要它們,也不會生成對應于偏移量和限制的系結引數 4 和 5。
注意:查詢成功,我沒有收到任何例外。
注意:請忽略計數查詢。這是故意不正確的。我添加了它以查看計數查詢是否有任何區別。但它沒有。
Q2 - Pageable 是否必須進行計數查詢才能作業?
uj5u.com熱心網友回復:
JPA 與查詢的其余部分分開處理限制和偏移量。
Spring Data 為您做的是:
- 從您的 SQL 陳述句創建一個查詢物件。
- 將引數系結到它(不包括可分頁)
limit為and呼叫特殊方法offset
所以這些值在你的 JPA 實作中得到了一些特殊的處理,我想這就是為什么它們沒有用正常的系結引數列印出來的原因。
另外我似乎記得某些資料庫根本不允許將這些設定為系結引數。這實際上可能是特殊待遇的最初原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/517452.html
