【SpringBoot】native queryでpaginationを使うとCOUNT(WHERE)というSQLが発行されてしまう件

最終更新日:2020‐04-02

JPAを使った実装でnative query + paginationを利用すると、paginationが全体の件数を求めるためか、自動生成でSELECT COUNT(*)~というSQLを生成してクエリ発行します。

しかし、これがどういうタイミング分からないのですが、SELECT COUNT(WHERE)のようなSQLを生成して、クエリを発行する場合があります。

stackoverflow.comの報告例

select count(*) from' is replaced by 'select count(where)' in spring jpa native query when using pagination

回避方法

@Queryには、countQuery というパラメータを指定できますので、これを設定してあげると自動生成されず、COUNT(WHERE)などという訳のわからんSQLは発行されなくなります。 下のコードは、パラメータの指定方法を少し手直ししてます。

  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = :lastname",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = :lastname",
    nativeQuery = true)
  Page<User> findByLastname(Pageable pageable, @Param("lastname") String lastname);

https://stackoverflow.com/questions/38349930/spring-data-and-native-query-with-pagination

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です