将两个数据库表合并为一个Vaadin Treetable

时间:2015-04-08 19:55:44

标签: sql-server database vaadin

TL; DR:如何将来自两个数据库表的信息组合成Vaadin Treetable(或者,当Vaadin 7.5发布时,是一个层次网格)?


我有一个Java Swing桌面应用程序,它目前正在执行此操作,尽管可能非常无效,Java Bean的ArrayLists每30秒从SQL Server更新一次。好吧,我现在正尝试将此桌面应用程序移植到Vaadin Web应用程序。桌面应用程序具有登录功能,我最终会担心为Web应用程序做同样的事情,但就目前而言,我只想尝试使用此Web应用程序的最基本部分:Treetable。或者,希望很快,一个heirarchical Grid。

为了帮助说明我的目标,我会尝试发布我创建的图像,该图像应该显示两个表中的数据是如何合并到treetable中的(使用我的部分屏幕截图)现有的桌面应用程序):

Diagram

我很清楚如何在SQL中使用 JOIN 命令,我已经简要地阅读了Referencing Another SQLContainer,但我还处于早期阶段学习Vaadin并且仍然试图围绕 SQLContainer FreeformQuery ,以及我需要如何为我的项目实现 FreeformStatementDelegate 。更不用说我需要为每一行实现复选框,正如您在该照片中看到的那样,以便在单击数据库时更新数据库。对于具有多个OrderDetail项目的作业而言,复选框的半选中状态是必需的,其中只有部分OrderDetail项目已完成。为了让我的Java Swing程序正常工作,我不得不依靠已经准备好大部分代码的专业Java开发人员,而且男孩,这是非常复杂的!

如果有人能够给我一个关于如何完成这项任务的高级视图以及一些例子,我将感激不尽。我完全理解我在这里要求很多,而且我愿意一步一步地放慢速度,只要你愿意。我真的想要完全理解这一点,所以我不仅不经过思考就复制粘贴代码。

2 个答案:

答案 0 :(得分:0)

我从未使用SQLContainer所以这可能不是您想要的答案。我只是快速查看SQLContainer,我不确定它是否符合您的目的。对于TreeTable,您需要一个Container实现Container.Hierarchical接口,否则该表会在其周围放置一个包装器,您必须手动设置父子关系。您可能可以扩展SQLContainer并在该类中实现Container.Hierarchical中的方法,但这可能会变得复杂。

在您的情况下,我认为我应该实现自己的容器,可能会扩展AbstractContainer,以免费获取侦听器代码,并实现Hierarchical。我知道有很多方法可以实现,所以这需要一些时间,但大多数方法都可以快速实现,您可以从基本方法开始并添加更多接口(OrderedSortable,稍后IndexedFilterableCollapsible,...)。
如果操作得当,您最终会得到易于阅读的代码,可以在将来扩展而不会有太多麻烦,您将不再依赖于SQLContainer的未来版本。

另一个好处是,您将了解很多关于vaadin中使用的数据结构(ContainerItemProperty)的信息。但正如我所说,我真的不知道SQLContainer所以也许会有一个更好的答案,告诉你SQLContainer

很容易

对于Checkbox功能,您可以将名称/产品属性显示为CheckBox。使用Icon和Caption,它看起来几乎就像你想要的那样。请参阅http://demo.vaadin.com/sampler/#ui/data-input/other/check-box并设置图标。半检查状态可以用css完成。

希望这可以帮助您找到适合您任务的正确解决方案。

答案 1 :(得分:0)

我承认我自己是vaadin的初学者,并且可能有更好的方法来做到这一点,但这里有一些我嘲笑的东西似乎有效。它并不能满足您的所有需求,但它可能是您的基础。最重要的是,要将更改保存回数据库,您需要在容器中的某些内容发生更改时更新SQLContainer。

import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.util.HierarchicalContainer;
import com.vaadin.data.util.sqlcontainer.SQLContainer;

@SuppressWarnings("serial")
public class TwoTableHierarchicalContainer extends HierarchicalContainer {
    private SQLContainer parentContainer;
    private SQLContainer childContainer;
    private String parentPrimaryKey;
    private String childForeignKey;

    public TwoTableHierarchicalContainer(SQLContainer parentContainer, SQLContainer childContainer,
            String parentPrimaryKey, String childForeignKey) {
        this.parentContainer = parentContainer;
        this.childContainer = childContainer;
        this.parentPrimaryKey = parentPrimaryKey;
        this.childForeignKey = childForeignKey;
        init();
    }

    private void init() {
        for (Object containerPropertyIds : parentContainer.getContainerPropertyIds()) {
            addContainerProperty(containerPropertyIds, Object.class, "");
        }
        for (Object containerPropertyIds : childContainer.getContainerPropertyIds()) {
            addContainerProperty(containerPropertyIds, Object.class, "");
        }
        for (Object itemId : parentContainer.getItemIds()) {
            Item parent = parentContainer.getItem(itemId);
            Object newParentId = parent.getItemProperty(parentPrimaryKey).getValue();
            Item newParent = addItem(newParentId);
            setChildrenAllowed(newParentId, false);
            for (Object propertyId : parent.getItemPropertyIds()) {
                @SuppressWarnings("unchecked")
                Property<Object> newProperty = newParent.getItemProperty(propertyId);
                newProperty.setValue(parent.getItemProperty(propertyId).getValue());
            }
        }
        for (Object itemId : childContainer.getItemIds()) {
            Item child = childContainer.getItem(itemId);
            Object newParentId = child.getItemProperty(childForeignKey).getValue();
            Object newChildId = addItem();
            Item newChild = getItem(newChildId);
            setChildrenAllowed(newParentId, true);
            setParent(newChildId, newParentId);
            setChildrenAllowed(newChildId, false);
            for (Object propertyId : child.getItemPropertyIds()) {
                @SuppressWarnings("unchecked")
                Property<Object> newProperty = newChild.getItemProperty(propertyId);
                newProperty.setValue(child.getItemProperty(propertyId).getValue());
            }
        }
    }
}