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);
}
Ответы
Ответ 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);
}
Обратите внимание, что вам может потребоваться отключить собственные запросы с динамическими запросами.
Ответ 4
Перепишите свой запрос на:
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
Ответ 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