Tengo un proyecto de arranque de primavera que usa la base de datos MySQL. Tengo una tabla llamada Empleado que tiene un índice principal (id) que no está numerado uno por uno (1, 31, 35, 100, etc.). Quiero que estén numerados como (1, 2, 3, 4)

También hay una pregunta similar aquí

Obtuve el formulario de consulta sobre el enlace SET @i=0; UPDATE Employee SET id=(@i:=@i+1); y funciona bien si lo ejecuto directamente en MySQL workbench

Mi pregunta es ¿cómo puedo ejecutar la consulta anterior usando la anotación de primavera?

EmployeeRepository.java

public interface EmployeeRepositoryextends JpaRepository<Employee, Integer> {
    
    @Transactional
    @Modifying
    @Query(value = "SET @i=0; UPDATE Employee e SET e.id=(@i:=@i+1)", nativeQuery = true)
    public void renumberingId();    
}

EmployeeService.java

   @Service
   public class EmployeeService {

        @Autowired
        private EmployeeRepository repo;
        
        public void renumber() {
             repo.renumberingId();
        }
   }

Cuando pruebo el método renumber() usando junit, me da la siguiente excepción

org.hibernate.QueryException: Space is not allowed after parameter prefix ':' [SET @i=0; UPDATE Employee e SET e.id=(@i:=@i+1)];

Por favor ayude a cómo se puede ejecutar esta consulta SET @i=0; UPDATE Employee SET id=(@i:=@i+1); usando el método renumberingId()

0
Mohammad Rahim Taheri 25 ago. 2020 a las 14:42

2 respuestas

La mejor respuesta

Su conjunto de consultas SET @i=0; UPDATE Employee e SET e.id=(@i:=@i+1) es correcto. Simplemente modifíquelo ligeramente: mueva la inicialización de la variable a ACTUALIZAR: UPDATE Employee e, (SELECT @i:=0) var SET e.new_column =(@i:=@i+1);

su consulta funciona bien en MySQL workbench. el problema es que la anotación @Query () siempre busca un parámetro después de :

Si es así, puede llenar una nueva columna con la enumeración

UPDATE Employee t0
  JOIN ( SELECT t1.id, COUNT(t2.id) cnt
         FROM Employee t1
         JOIN Employee t2 ON t1.id >= t2.id
         GROUP BY t1.id ) t3 ON t0.id = t3.id
SET t0.new_column = t3.cnt;

violín de modelado

1
Akina 25 ago. 2020 a las 12:45

No necesitas todo esto para eso, así es como se hace:

import javax.persistance.*;

@Entity   
public class Employee {   

  @Id   
  @GeneratedValue(strategy=GenerationType.IDENTITY)   
  public long id;

} 

Y debería hacer automáticamente lo que esperas

0
Big Zed 25 ago. 2020 a las 11:52
63578094