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()
2 respuestas
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;
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
Nuevas preguntas
java
Java es un lenguaje de programación de alto nivel. Utilice esta etiqueta cuando tenga problemas para usar o comprender el idioma en sí. Esta etiqueta rara vez se usa sola y se usa con mayor frecuencia junto con [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] y [maven].