Spring Pageable NamedNativeQuery

#java #spring #hibernate #jpa

#java #весна #переход в спящий режим #jpa

Вопрос:

Я столкнулся с проблемой, из-за которой трудно найти хорошие примеры или ссылки для такого рода проблем. Я пытаюсь добавить подкачку к моему уже существующему NamedNativeQuery. Насколько я понимаю, вам нужно предоставить другой NamedNativeQuery для подкачки страниц с добавлением .count в конец имени.

Мой текущий запрос выглядит примерно так:

 @NamedNativeQuery(
    name="Foo.getObj",
    resultSetMapping="obj",
    query="SELECT item1, item2, item3, ... 
        FROM Table1 t1 Join Table2 t2 On t1.id = t2.id ...
        WHERE t1.num = :num" 
)
 

Это моя попытка запроса подкачки:

 @NamedNativeQuery(
    name="Foo.getObj.count",
    resultSetMapping="obj",
    query="SELECT COUNT(item1, item2, item3, ...) 
        FROM Table1 t1 Join Table2 t2 On t1.id = t2.id ...
        WHERE t1.num = :num" 
)
 

мой вызывающий абонент такой:

 @Query(nativeQuery=true)
public List<Foo>retrieveFoo(ServiceRequest req){
    return repo.retrieveFoo(@Param("num") foo.getNum(), PageRequest.of(0, req.pages)); //req.pages is never less than 1
}
 

Я все еще новичок в Spring, JPA и Hibernate, но я ограничен его реализацией таким образом или каким-то образом, подобным этому.
Я могу протестировать его, если Pageable является новой страницей (0, 1). Но любая сумма, превышающая 1, вызывает это исключение:
org.springframework.orm.jpa.JpaSystemException «Невозможно вызвать класс service.sources.Конструктор Foo; вложенным исключением является org.Исключение HibernateException: невозможно вызвать класс service.sources.Конструктор Foo»

Любые советы по обработке подкачки NamedNativeQueries или документации были бы полезны, похоже, я не могу найти много примеров подкачки с помощью таких запросов.

Ответ №1:

Оказывается, этот способ вызова pageable @NamedNativeQuery является правильным. Один из аргументов, возвращаемых из базы данных, был null и присваивался примитиву, когда он должен был принадлежать его варианту класса. Поэтому вместо того, чтобы присваивать ему тип Integer, я присваивал ему тип int. Это привело к сбою при поиске правильного конструктора для моего запроса. Также просто так получилось, что число, которое я пытался использовать для этого случая, имело эту нулевую переменную для этого аргумента, а другие числа — нет. После исправления замены примитива вариантом класса все работает нормально.