如何对自引用结构进行排序?

s4n0splo  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(334)

在我的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<>();
}
zrfyljdw

zrfyljdw1#

假设要保存的新实体的排序顺序为x,
首先,您必须增加排序顺序>=x的所有其他列。最简单的方法是使用本机查询。

@Modifying
@Query("update item set sort_order = sort_order + 1 where sort_order >= ?1", nativeQuery = true)
int incrementSortOrders(int currentSortOrder);

在此之后,只需使用

repository.save(item)

更新:
如果排序顺序的格式是1-3-0、1-3-1、1-3-2、1-3-3以表示递归顺序,那么这是一种可能的解决方案-
假设我们得到排序键为1-3-1的新实体,
我们仍然可以确定要用>操作符递增的项,因为它们在字典中会更大。
我们可以将当前节点sequnce的前缀计算为 1-3- 通过在代码中编写逻辑
然后我们可以运行以下查询,每隔一行递增一次。

@Modifying
@Query("update item set sort_order = CONCAT(:prefix ,CONVERT(SUBSTRING_INDEX(sort_order, :prefix, -1), UNSIGNED INTEGER) + 1) where sort_order > :currentNodeOrder", nativeQuery = true)
int incrementSortOrders(String prefix, String currentNodeOrder); //prefix is `1-3-` which was pre calculated and current node order is `1-3-1`

相关问题