亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何打印 LIMIT 和 OFFSET 的 SQL 參數

如何打印 LIMIT 和 OFFSET 的 SQL 參數

慕尼黑8549860 2023-05-10 17:38:05
概括我正在使用 JPA (Hibernate) 編寫代碼,并想檢查日志中的 LIMIT 和 OFFSET 參數。我添加了 Logback 并正確設置了日志級別,但我無法執行上述操作。我怎樣才能做到這一點?環境采用OpenJDK 11.0.4休眠 5.4.4.FinalLogback 經典版 1.2.3MySQL 8.0.17logback.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration><configuration>    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        <encoder>            <pattern>[%-5level][%-10thread] %logger{36} - %msg%n</pattern>        </encoder>    </appender>    <root level="INFO">        <appender-ref ref="STDOUT"/>    </root>    <!-- Print SQL to log-->    <logger name="org.hibernate.SQL" level="DEBUG" />    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /></configuration>我的 Java 代碼使用 JPAEntityManagerFactory emf = Persistence.createEntityManagerFactory("FooPU");EntityManager em = emf.createEntityManager();String jpql = "SELECT f FROM Foo f ORDER BY f.id";// Specify LIMIT and OFFSETList<Foo> fooList =  = em.createQuery(jpql, Foo.class)        .setFirstResult(1)        .setMaxResults(3)        .getResultList();for (Foo f : fooList) {    System.out.println(f);}em.close();emf.close();日志(實際)沒有顯示 LIMIT 和 OFFSET 的參數。我只能看到一個 SQL。[DEBUG][main      ] org.hibernate.SQL - select foo0_.id as id1_1_, ... from Foo foo0_ order by foo0_.id limit ?, ?附帶說明一下,其他 SQL 參數已正確顯示。[DEBUG][main      ] org.hibernate.SQL - select foo0_.id as id1_0_0_, ... from Foo foo0_ where foo0_.id=?[TRACE][main      ] o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - [10]日志(預期)[DEBUG][main      ] org.hibernate.SQL - select foo0_.id as id1_1_, ... from Foo foo0_ order by foo0_.id limit ?, ?[TRACE][main      ] o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - [1][TRACE][main      ] o.h.type.descriptor.sql.BasicBinder - binding parameter [2] as [INTEGER] - [3]
查看完整描述

3 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

可能,它現在不支持。PreparedStatement通常參數通過ValueBinder接口(實際上是擴展類BasicBinder)綁定到一個,BasicBinder具有將綁定參數打印到日志的功能。但是 limit/offset 參數綁定到一個PreparedStatement沒有ValueBinder接口的,因此 limit/offset 參數不會打印到日志中。我建議創建一個支持打印限制/偏移參數到日志的新問題!!



查看完整回答
反對 回復 2023-05-10
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

您可以使用:setFirstResult(0).setMaxResults(5);?

如果你使用 entityManager,它可以是這樣的:

entityManager.createQuery("yourQuery").setFirstResult(0).setMaxResults(5);


查看完整回答
反對 回復 2023-05-10
?
米脂

TA貢獻1836條經驗 獲得超3個贊

您正在撰寫 JPQL 請求,JPA 不允許在其中使用關鍵字 LIMIT/OFFSET。調用 setFirstResult(1) 和 setMaxResults(3) 不會將 OFFSET 和 LIMIT 子句附加到查詢。第一個選項是對您的數據庫使用本機 SQL 查詢,但這會使代碼不可移植。另一種選擇是使用 Pageable 來檢索結果(不確定它是否會為您生成預期的日志行,但您需要檢查):


@Query("SELECT f FROM Foo f ORDER BY f.id DESC") // or ASC

List<Foo> getLastDetails(Pageable pageable);


List<Foo> fooList = getLastDetails(new PageRequest(0,1)); // (int page, int size)

查看完整回答
反對 回復 2023-05-10
  • 3 回答
  • 0 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號