Spring Data JPAを使用しており、@Query
を使用してクエリを定義するときWITHOUTPageable
、それは動作します:
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
@Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%",
nativeQuery = true)
List<UrnMapping> fullTextSearch(String text);
}
しかし、2番目のパラメータPageable
を追加すると、@Query
は機能せず、Springはメソッドの名前を解析してから、exceptionNo property full found
をスローします。これはバグですか?
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
@Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%",
nativeQuery = true)
Page<UrnMapping> fullTextSearch(String text, Pageable pageable);
}
同様の質問は Springフォーラムで尋ねられた でした。そこでは、ページネーションを適用するには、2番目のサブクエリを導出する必要があることが指摘されました。サブクエリは同じフィールドを参照しているため、クエリが参照するエンティティ/テーブルのエイリアスを使用していることを確認する必要があります。これは、あなたが書いた場所:
select * from internal_uddi where urn like
代わりに次のものが必要です。
select * from internal_uddi iu where iu.urn like ...
ネイティブクエリでページネーションを使用できます。ここに文書化されています: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_native_queries
「ただし、カウントクエリを自分で指定することで、ページネーションにネイティブクエリを使用できます。例59. @Queryを使用して、クエリメソッドでページネーションにネイティブカウントクエリを宣言します」
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery = true)
Page<User> findByLastname(String lastname, Pageable pageable);
}
UrnMapping
クラスがinternal_uddi
テーブルにマップされることを考慮して、これをお勧めします。
@Repository
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
@Query(value = "select iu from UrnMapping iu where iu.urn like %:text% or iu.contact like %:text%")
Page<UrnMapping> fullTextSearch(@Param("text") String text, Pageable pageable);
}
動的リクエストを使用したネイティブクエリをオフにする必要がある場合があることに注意してください。
クエリを次のように書き換えます。
select iu from internal_uddi iu where iu.urn....
私はそれが異なるJPAバージョン間で異なることを発見しました。デバッグのために、生成されたSQLを表示するためにこの構成を追加する方が良いでしょう、それはあなたの時間を大いに節約します!
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
スプリングブート2.1.6.RELEASEの場合、正常に動作します!
Sort sort = new Sort(Sort.Direction.DESC, "column_name");
int pageNumber = 3, pageSize = 5;
Pageable pageable = PageRequest.of(pageNumber - 1, pageSize, sort);
@Query(value = "select * from integrity_score_view " +
"where (?1 is null or data_hour >= ?1 ) " +
"and (?2 is null or data_hour <= ?2 ) " +
"and (?3 is null or ?3 = '' or park_no = ?3 ) " +
"group by park_name, data_hour ",
countQuery = "select count(*) from integrity_score_view " +
"where (?1 is null or data_hour >= ?1 ) " +
"and (?2 is null or data_hour <= ?2 ) " +
"and (?3 is null or ?3 = '' or park_no = ?3 ) " +
"group by park_name, data_hour",
nativeQuery = true
)
Page<IntegrityScoreView> queryParkView(Date from, Date to, String parkNo, Pageable pageable);
order by
およびlimit
を記述しないでください。正しいSQLが生成されます
Spring Data JPAバージョン2.0.4以降を使用している場合は、: Spring Data JPA @Query を参照してください。以下のようなサンプル:
@Query(value = "SELECT u FROM User u ORDER BY id")
Page<User> findAllUsersWithPagination(Pageable pageable);