У меня есть репозиторий, с помощью которого я пытаюсь получить следующее значение из последовательности. Имя последовательности, которое мне нужно параметризовать.
Запрос репозитория выглядит так:
@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]
Это функциональная потребность, и необходимо получить следующий val из последовательности, чтобы его можно было использовать в качестве кода сотрудника.




Вы можете использовать EntityManager:
entityManager.createNativeQuery("select seqname.nextval ...").getSingleResult();
База данных, которую я использую, — это oracle, а менеджер сущностей был настроен в другом классе конфигурации как bean-компонент. Nextval(seqname) выдает ошибку: неизвестное значение. Могу ли я использовать что-либо с вышеуказанным подходом в репозитории JPA?
Я отредактировал вопрос с диалектом оракула, я не уверен, вы можете попробовать вставить его @Query
@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();
мы не можем использовать его без определения сущности? В любом случае мы можем назвать это двойным в репозитории?
@AshishChauhan да, вы можете использовать двойной
мне нужно вызвать его с em?
Да, em — Entity Manager
@AshishChauhan Пожалуйста, примите ответ и проголосуйте, чтобы другие узнали о правильном решении.
Привет, я столкнулся с похожей проблемой, такой как недостаточные привилегии при вызове последовательности. Как решить проблему
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')
есть ли способ получить порядковый номер без использования собственного запроса?
В 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 на название вашей последовательности
Зачем вам нужен nextval из последовательности?