在网格对象中选择后,getItem()在SQLContainer处返回null,但该行存在

时间:2016-08-02 14:36:20

标签: java mysql vaadin

有人可以告诉我我做错了什么吗?我只想从SQLContainer中选择一个项目,该项目使用Vaadin显示为网格对象。我基本上想要填写一个包含所选项目内容的表单,以便我可以在保存之前编辑该项目(标准CRUD)。

构建基块:

        String q4text = "select a.name, aty.name "
                + "from asset a "
                + "join assettype aty on a.assettype_id = aty.id";
        FreeformQuery q4 = new FreeformQuery(q4text, connectionPool, "a.id");
        q4.setDelegate(new AssetQueryDelegate());
        assetContainer = new SQLContainer(q4);

这是我使用FreeformQuery的SQLContainer。在代码段中,您会看到“a.id”作为主键。我过去曾尝试过“id”和“ID”。结果是一样的。可以通过DatabaseHelper访问此容器,并将其绑定到网格对象。

SQLContainer assetContainer = db.getAssetContainer();
grid.setContainerDataSource(assetContainer);

现在,我尝试使用以下代码段填充表单

    grid.addSelectionListener(event -> {
        if (event.getSelected().isEmpty()) {
            form.setVisible(false);
        } else {
            Set<Object> selected = event.getSelected();
            Item item = assetContainer.getItem(new Object[] {selected});
            form.setCustomer(item);
        }
    });

当我运行网络应用程序时,我可以看到网格内容,我可以排序。当我选择一行并调用getItem函数时会出现问题。我一直都是空的。我也尝试过使用assetContainer.getItem(已选中)。如果我通过调试器运行它,我确实在所选的Set中看到了rowId(相当于a.Id)。如果我将assetContainer打印到屏幕上,我也会看到内容,我可以看到我希望选择的项目,但结果始终为null。我使用了错误的功能吗? FreeformQuery中的主键是否有问题?我使用MYSQL设计了表,并且在资产和资产类型表中有两个主要名称为id的主键(当然,我希望asset.id是此查询的主键,而不是assettype.id)。

非常感谢

1 个答案:

答案 0 :(得分:0)

最后它比我预期的要容易得多(花了差不多一天的时间)。

    grid.addSelectionListener(event -> {
        if (event.getSelected().isEmpty()) {
            form.setVisible(false);
        } else {
            Item item = assetContainer.getItem(event.getSelected().iterator().next());
            form.setCustomer(item);
        }
    });