在我的spring启动应用程序中,有一个模型“item”,它有sefl引用。我想实现按字段排序器的排序,但我不知道如何为crud操作实现它。例如,如何在将实体保存到存储库之前获取sortorder的值,以及如何在更新实体之后重新计算sortorder。任何帮助都将不胜感激!谢谢!
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "item")
public class Item {
@Id
@JsonFormat(shape = JsonFormat.Shape.STRING)
@SequenceGenerator(name = "itemSeq", sequenceName = "item_id_seq", allocationSize = 50)
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "itemSeq")
private Long id;
@NotBlank
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@Column(name = "sort_order")
private String sortOrder;
@Column(name = "is_active")
private Boolean isActive;
@ManyToOne
@JoinColumn(name = "parent_id")
@JsonFormat(shape = JsonFormat.Shape.STRING)
@JsonIgnoreProperties({"name", "description", "sortOrder", "isActive", "parent", "children"})
private Item parent;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Where(clause = "is_active = true")
@Fetch(FetchMode.SUBSELECT)
@OrderBy("sort_order ASC")
private List<Item> children = new ArrayList<>();
}
1条答案
按热度按时间zrfyljdw1#
假设要保存的新实体的排序顺序为x,
首先,您必须增加排序顺序>=x的所有其他列。最简单的方法是使用本机查询。
在此之后,只需使用
更新:
如果排序顺序的格式是1-3-0、1-3-1、1-3-2、1-3-3以表示递归顺序,那么这是一种可能的解决方案-
假设我们得到排序键为1-3-1的新实体,
我们仍然可以确定要用>操作符递增的项,因为它们在字典中会更大。
我们可以将当前节点sequnce的前缀计算为
1-3-
通过在代码中编写逻辑然后我们可以运行以下查询,每隔一行递增一次。