Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用spring注释对表的主索引重新编号?_Java_Mysql_Spring_Spring Boot - Fatal编程技术网

Java 如何使用spring注释对表的主索引重新编号?

Java 如何使用spring注释对表的主索引重新编号?,java,mysql,spring,spring-boot,Java,Mysql,Spring,Spring Boot,我有一个SpringBoot项目,它使用MySQL数据库。我有一个名为Employee的表,它有一个主索引id,没有逐个编号1、31、35、100等等。。我想让它们像1,2,3,4那样编号 还有类似的问题 我得到了链接集@I=0上面的查询表单;更新员工集合id=@i:=@i+1;如果直接在MySQL workbench中执行它,则工作正常 我的问题是如何使用spring注释执行上述查询 EmployeeRepository.java public interface EmployeeReposi

我有一个SpringBoot项目,它使用MySQL数据库。我有一个名为Employee的表,它有一个主索引id,没有逐个编号1、31、35、100等等。。我想让它们像1,2,3,4那样编号

还有类似的问题

我得到了链接集@I=0上面的查询表单;更新员工集合id=@i:=@i+1;如果直接在MySQL workbench中执行它,则工作正常

我的问题是如何使用spring注释执行上述查询

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();    
}
当使用junit测试重新编号方法时,它给出了以下异常

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

请帮助如何执行此查询集@i=0;更新员工集合id=@i:=@i+1;使用renumberingId方法,您不需要所有这些,它是这样做的:

import javax.persistance.*;

@Entity   
public class Employee {   

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

} 
它应该能满足你的期望

您的查询集@i=0;更新员工e集合e.id=@i:=@i+1是正确的。只需稍加修改-将变量初始化移到UPDATE:updateemployee e中,选择@i:=0 var SET e.new_column=@i:=@i+1

您的查询在MySQL工作台中运行良好。问题是@Query注释总是在以下时间之后搜索参数:

如果是这样,您可以使用枚举填充新列

更新员工t0 加入选择t1.id,COUNTt2.id cnt 来自员工t1 在t1.id>=t2.id上加入员工t2 根据t0.id=t3.id上的t1.id t3分组 设置t0.new_column=t3.cnt;
你没有。它编号为1,2,3。。。但中间的元素已被删除。如果你开始改变它,使用索引就变得毫无意义了。我有一个名为Employee的表,它有一个主索引id,它没有逐个编号1、31、35、100等等。。我希望他们像1,2,3,4那样编号,永远不要这样做。如果需要静态相邻枚举,则只需在表中再创建一列并枚举其中的行;如果需要动态枚举,则在检索查询时执行。主索引在表的整个生命周期内唯一标识一行。注意-桌子,而不是行。换句话说,即使删除了一行,也不是将其主键值分配给另一行或新插入的行的理由。@Akina您能帮助我如何枚举另一列吗?您的查询设置为@I=0;更新员工e集合e.id=@i:=@i+1是正确的。只需稍加修改-将变量初始化移到UPDATE:updateemployee e中,选择@i:=0 var SET e.new_column=@i:=@i+1;感谢您的回答,在从员工中删除一行后,不会对id重新编号table@MohammadRahimTaheri从来没有想过尝试重新编号的id。您的业务逻辑将有多个具有相同id的对象,并且具有不再有效的已知id。这是一个不容易做到的原因。我无法理解您的查询,但效果很好,这是迄今为止最好的答案。非常感谢:@mohammadhamitaheri我无法理解您的查询。它很简单。请参见内部选择子查询-对于每个id,它计算表中的值的数量,这些值小于或等于。该金额实际上是行号。然后通过外部更新将计算出的数字存储到表中。
import javax.persistance.*;

@Entity   
public class Employee {   

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

}