有人可以告诉我我做错了什么吗?我只想从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)。
非常感谢
答案 0 :(得分:0)
最后它比我预期的要容易得多(花了差不多一天的时间)。
grid.addSelectionListener(event -> {
if (event.getSelected().isEmpty()) {
form.setVisible(false);
} else {
Item item = assetContainer.getItem(event.getSelected().iterator().next());
form.setCustomer(item);
}
});