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

#java #sql #spring #jpa #spring-data-jpa

#java #sql #spring #jpa #spring-data-jpa

Вопрос:

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

Запрос репозитория выглядит следующим образом:

@Query(значение = «ВЫБРАТЬ ?1.NEXTVAL из dual;», NativeQuery = true) Строка получает идентификатор (@Param(«seqName»)) Строка 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]
  

Комментарии:

1. Зачем вам нужен nextval из sequence?

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

Ответ №1:

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

}
  

Комментарии:

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

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

3. Как я могу использовать динамическую СХЕМУ для собственного запроса (отличную от схемы по умолчанию). Например, в случае Oracle DB, где кто-то хочет выбрать последовательность из другой схемы, которая может быть динамической.

4. @MauricioToledo снова думаю, может быть, вы можете использовать sequence, создав другой метод в каком-нибудь репозитории, но вы должны изменить schema.sequence_name, который соответствует тому, который вы хотите использовать … я не знаю, никогда этого не делал, может быть, работает

5. @Hinotori Я установил последовательность как собственный запрос SQL в другом репозитории. И это сработало!

Ответ №2:

В PostgreSQL это:

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

Ответ №3:

 @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();
  

Комментарии:

1. разве мы не можем использовать его без определения сущности? Каким-либо образом мы можем вызвать его с помощью dual в репозитории?

2. @AshishChauhan да, вы можете использовать dual

3. нужно ли мне вызывать его с помощью em?

4. Да, em является Entity Manager

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

Ответ №4:

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

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

Комментарии:

1. База данных, которую я использую, является oracle, а entity manager был настроен в другом классе конфигурации в качестве компонента. nextval (seqname) выдает ошибку, указывающую неизвестное значение. Разве я не могу использовать что-либо с вышеупомянутым подходом в репозитории JPA?

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

Ответ №5:

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

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

ПРИМЕЧАНИЕ: вам следует заменить code_sequence свое имя последовательности