vaadin网格 - 来自多个对象的数据

发布于 2025-01-20 10:58:22 字数 3604 浏览 5 评论 0原文

我想在一个网格中显示来自两个不同对象的数据。我有“文件夹”和“项目”,我希望在一个网格中看到它们。文件夹位于顶部,项目位于文件夹下方。类似于文件管理器应用程序中的列表视图。但我不知道如何将数据整合在一起。我可能可以使用我在网格中使用的 getter 方法为 ItemFolder 类创建一个抽象父类。对此有更好的解决方案吗?

预期结果:

“预期结果”

@Route(value = "")
@PageTitle("Items | Test")
public class ListView extends VerticalLayout {
    
    Grid<Item> grid = new Grid<>(Item.class);
    ItemService service;

    Folder currentFolder;

    public ListView(ItemService service) {
        this.service = service;
        this.currentFolder = service.getAllFolders().get(0);
        addClassName("list-view");

        add(getGrid());
        updateList();
    }

    private HorizontalLayout getGrid() {
        HorizontalLayout layout = new HorizontalLayout(grid);
        layout.setSizeFull();

        grid.addClassNames("grid");
        grid.setColumns("name");
        grid.addColumn(testCase -> testCase.getStatus().getValue()).setHeader("Status").setSortable(true);
        grid.addColumn(new ComponentRenderer<>(
                        testCase -> {
                            Checkbox checkbox = new Checkbox();
                            checkbox.setValue(testCase.getBooleanValue());
                            checkbox.setReadOnly(true);
                            return checkbox;
                        }
                )
        ).setHeader("Boolean");
        grid.getColumns().forEach(col -> col.setAutoWidth(true));

        return layout;
    }

    private void updateList() {
        grid.setItems(service.getItemsFromFolder(currentFolder));
    }
}

服务:

@Service
public class ItemService {

    private final ItemRepository itemRepository;
    private final FolderRepository folderRepository;

    public ItemService(ItemRepository itemRepository, FolderRepository folderRepository) {
        this.itemRepository = itemRepository;
        this.folderRepository = folderRepository;
    }

    public List<Folder> getAllFolders() {
        return folderRepository.findAll();
    }

    public List<Item> getItemsFromFolder(Folder folder) {
        return itemRepository.getItemsFromFolder(folder.getId());
    }

}

项目存储库:

public interface ItemRepository extends JpaRepository<Item, Long> {

    @Query("Select i from Item i where i.folder.id = :folderId")
    List<Item> getItemsFromFolder(@Param("folderId") Long folderId);
}

文件夹存储库:

public interface FolderRepository extends JpaRepository<Folder, Long> {
    
}

项目实体:

@Entity
@Getter
@Setter
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotEmpty
    private String name = "";

    @Enumerated
    @Column(columnDefinition = "smallint")
    private Status status;

    @NotNull
    private Boolean booleanValue;

    @ManyToOne
    @JoinColumn(name = "folder_id")
    @NotNull
    private Folder folder;

}

文件夹实体:

@Entity
@Getter
@Setter
public class Folder {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Long parentFolderId;

}

状态枚举:

@AllArgsConstructor
public enum Status {

    DRAFT("Draft"),
    READY("Ready"),
    OBSOLETE("Obsolete");

    @Getter
    private final String value;

}

I would like to show data from two different objects in one Grid. I have "folders" and "items" and I would like to see them together in one Grid. Folders at the top and items below folders. Something like list view in file manager application. But I don't know how to get the data together. I could probably create an abstract parent class for Item and Folder classes with getter methods, which I'm using in the grid. Is there any better solution for that?

Expected result:

expected result

@Route(value = "")
@PageTitle("Items | Test")
public class ListView extends VerticalLayout {
    
    Grid<Item> grid = new Grid<>(Item.class);
    ItemService service;

    Folder currentFolder;

    public ListView(ItemService service) {
        this.service = service;
        this.currentFolder = service.getAllFolders().get(0);
        addClassName("list-view");

        add(getGrid());
        updateList();
    }

    private HorizontalLayout getGrid() {
        HorizontalLayout layout = new HorizontalLayout(grid);
        layout.setSizeFull();

        grid.addClassNames("grid");
        grid.setColumns("name");
        grid.addColumn(testCase -> testCase.getStatus().getValue()).setHeader("Status").setSortable(true);
        grid.addColumn(new ComponentRenderer<>(
                        testCase -> {
                            Checkbox checkbox = new Checkbox();
                            checkbox.setValue(testCase.getBooleanValue());
                            checkbox.setReadOnly(true);
                            return checkbox;
                        }
                )
        ).setHeader("Boolean");
        grid.getColumns().forEach(col -> col.setAutoWidth(true));

        return layout;
    }

    private void updateList() {
        grid.setItems(service.getItemsFromFolder(currentFolder));
    }
}

Service:

@Service
public class ItemService {

    private final ItemRepository itemRepository;
    private final FolderRepository folderRepository;

    public ItemService(ItemRepository itemRepository, FolderRepository folderRepository) {
        this.itemRepository = itemRepository;
        this.folderRepository = folderRepository;
    }

    public List<Folder> getAllFolders() {
        return folderRepository.findAll();
    }

    public List<Item> getItemsFromFolder(Folder folder) {
        return itemRepository.getItemsFromFolder(folder.getId());
    }

}

Item Repository:

public interface ItemRepository extends JpaRepository<Item, Long> {

    @Query("Select i from Item i where i.folder.id = :folderId")
    List<Item> getItemsFromFolder(@Param("folderId") Long folderId);
}

Folder Repository:

public interface FolderRepository extends JpaRepository<Folder, Long> {
    
}

Item Entity:

@Entity
@Getter
@Setter
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotEmpty
    private String name = "";

    @Enumerated
    @Column(columnDefinition = "smallint")
    private Status status;

    @NotNull
    private Boolean booleanValue;

    @ManyToOne
    @JoinColumn(name = "folder_id")
    @NotNull
    private Folder folder;

}

Folder Entity:

@Entity
@Getter
@Setter
public class Folder {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Long parentFolderId;

}

Status enum:

@AllArgsConstructor
public enum Status {

    DRAFT("Draft"),
    READY("Ready"),
    OBSOLETE("Obsolete");

    @Getter
    private final String value;

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迟月 2025-01-27 10:58:22

Grid 只能有一种类型的 bean,因此抽象父类或接口是最佳选择。但是考虑到“文件夹”和“项目”的用例描述,您是否考虑过使用 TreeGrid 而是?

Grid can only have one type of bean, so an abstract parent class or interface is the way to go. But given the description of your use case of "folders" and "items", have you considered using TreeGrid instead?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文