#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
свое имя последовательности