Подтвердить что ты не робот

Spring данные jpa @query и доступные для просмотра

Я использую Spring Data JPA, и когда я использую @Query для определения запроса БЕЗ Pageable, он работает:

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

Но если я добавлю второй параметр Pageable, @Query НЕ будет работать, а Spring проанализирует имя метода, а затем выбросит исключение No 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);
}
4b9b3361

Ответ 1

Аналогичный вопрос был задан на форумах Spring, где указывалось, что для применения разбивки на страницы требуется получить второй подзапрос. Поскольку подзапрос ссылается на одни и те же поля, вам необходимо убедиться, что ваш запрос использует псевдонимы для имен/таблиц, на которые он ссылается. Это означает, что где вы написали:

select * from internal_uddi where urn like

Вместо этого вы должны:

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

Ответ 2

Вы можете использовать нумерацию страниц с собственным запросом. Это задокументировано здесь: 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);
}

Ответ 3

Учитывая, что класс 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);
}

Обратите внимание, что вам может потребоваться отключить собственные запросы с динамическими запросами.

Ответ 5

Пожалуйста, обратитесь: Spring Data JPA @Query, если вы используете Spring Data JPA версии 2.0.4 и выше. Образец как ниже:

@Query(value = "SELECT u FROM User u ORDER BY id")
Page<User> findAllUsersWithPagination(Pageable pageable);

Ответ 6

Я обнаружил, что он работает по-разному в разных версиях jpa, для отладки, вам лучше добавить эту конфигурацию, чтобы показать сгенерированный sql, это сэкономит ваше время!

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

для весенней загрузки 2.1.6. ПОЖАЛУЙСТА, работает хорошо!

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