web-dev-qa-db-ja.com

spring data jpa @queryおよびページング可能

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);
}
51
Awakening

同様の質問は Springフォーラムで尋ねられた でした。そこでは、ページネーションを適用するには、2番目のサブクエリを導出する必要があることが指摘されました。サブクエリは同じフィールドを参照しているため、クエリが参照するエンティティ/テーブルのエイリアスを使用していることを確認する必要があります。これは、あなたが書いた場所:

select * from internal_uddi where urn like

代わりに次のものが必要です。

select * from internal_uddi iu where iu.urn like ...
29
Steve

ネイティブクエリでページネーションを使用できます。ここに文書化されています: 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);
}
36
RemusS

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);
}

動的リクエストを使用したネイティブクエリをオフにする必要がある場合があることに注意してください。

8
Dimitri Hautot

クエリを次のように書き換えます。

select iu from internal_uddi iu where iu.urn.... 

説明: http://forum.spring.io/forum/spring-projects/data/126415-is-it-possible-to-use-query-and-pageable?p=611398#post611398

1

私はそれが異なる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が生成されます

0
kite

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);
0
shenyu1997