Запрос для получения nextval из последовательности с помощью Spring JPA

У меня есть репозиторий, с помощью которого я пытаюсь получить следующее значение из последовательности. Имя последовательности, которое мне нужно параметризовать.

Запрос репозитория выглядит так:

@Query(value = "SELECT ?1.NEXTVAL from dual;", nativeQuery = true) String getSeqID(@Param("seqName") String seqName);

Но я получаю следующее исключение:

org.hibernate.QueryException: JPA-style positional param was not an integral ordinal
    at org.hibernate.engine.query.spi.ParameterParser.parse(ParameterParser.java:187) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.engine.query.spi.ParamLocationRecognizer.parseLocations(ParamLocationRecognizer.java:59) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.engine.query.internal.NativeQueryInterpreterStandardImpl.getParameterMetadata(NativeQueryInterpreterStandardImpl.java:34) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getSQLParameterMetadata(QueryPlanCache.java:125) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]

Зачем вам нужен nextval из последовательности?

Peter Šály 05.03.2019 16:40

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

Ashish Chauhan 05.03.2019 16:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
27 964
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать EntityManager:

entityManager.createNativeQuery("select seqname.nextval ...").getSingleResult();

База данных, которую я использую, — это oracle, а менеджер сущностей был настроен в другом классе конфигурации как bean-компонент. Nextval(seqname) выдает ошибку: неизвестное значение. Могу ли я использовать что-либо с вышеуказанным подходом в репозитории JPA?

Ashish Chauhan 05.03.2019 16:48

Я отредактировал вопрос с диалектом оракула, я не уверен, вы можете попробовать вставить его @Query

Andronicus 05.03.2019 18:55
@Entity
@Table(name = "tabelName")
public class yourEntity{
    @Id
    @SequenceGenerator(name = "yourName", sequenceName = "yourSeqName", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "yourName")
    @Column(name = "id", updatable = false)
    protected Long id;
}

@Query(value = "SELECT yourSeqName.nextval FROM tableName", nativeQuery = true)
Long getNextSeriesId();

Обновлено:

Query q = em.createNativeQuery("SELECT yourSeqName.NEXTVAL FROM DUAL");
return (java.math.BigDecimal)q.getSingleResult();

мы не можем использовать его без определения сущности? В любом случае мы можем назвать это двойным в репозитории?

Ashish Chauhan 05.03.2019 17:53

@AshishChauhan да, вы можете использовать двойной

Romil Patel 05.03.2019 18:01

мне нужно вызвать его с em?

Ashish Chauhan 05.03.2019 18:03

Да, em — Entity Manager

Romil Patel 05.03.2019 18:08

@AshishChauhan Пожалуйста, примите ответ и проголосуйте, чтобы другие узнали о правильном решении.

Romil Patel 06.03.2019 05:29

Привет, я столкнулся с похожей проблемой, такой как недостаточные привилегии при вызове последовательности. Как решить проблему

Thadeuse 30.06.2021 10:57
Ответ принят как подходящий
package br.com.mypackage.projectname.repository;

import java.math.BigDecimal;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface MyRepository extends JpaRepository<Myentity, Long> {

    @Query(value = "SELECT SCHEMA.SEQUENCE_NAME.nextval FROM dual", nativeQuery = true)
    public BigDecimal getNextValMySequence();

}

Нативный запрос, подобный этому, сработал у меня select nextval('sequence_name')

Nitin Kamate 19.04.2021 05:36

есть ли способ получить порядковый номер без использования собственного запроса?

Venkata Ramireddy CH 27.01.2022 19:51

В PostgreSQL это:

Long value = Long.parseLong(entityManager
            .createNativeQuery("select nextval('sequence_name')")
            .getSingleResult().toString());

Я исправил эту проблему, используя следующий код:

@Query(value = "SELECT NEXT VALUE FOR code_sequence", nativeQuery = true)
public BigDecimal getNextValCodeSequence();

Примечание: вы должны заменить code_sequence на название вашей последовательности

Другие вопросы по теме