Grails GORM域类,具有相同类型和重复条目的hasMany

时间:2015-02-24 13:47:43

标签: grails groovy gorm

简单来说,它是一个与SKU相关的库存系统。 SKU是项目的组合,有时是完全相同项目的倍数。

E.G

用餐室的SKU将是4(Item)“chair”和1(Item)“table”。如果我能让GORN认识到它与“椅子”的多个实例相关联,那么我可以继续计算。

这是我尝试过的基本代码

class Item implements Serializable{
    String name;
    String description;

}

class Sku {
    String description;
    String skuCode;
    Collection items;
    static hasMany = [items:Item];
}
//… GENERATE TEST DATA
    item = new Item(name:"Table", description:"Oak table");
    item.save();

    item = new Item(name:"Chair", description:"Oak chair");
    item.save();

    sku= new Sku(description:"A complete dining room set for 4");
    sku.items = [Item.findByName("Table"),Item.findByName("Chair"),
                     Item.findByName("Chair"),Item.findByName("Chair"),
                     Item.findByName("Chair")];
    sku.save();

这只会将SKU显示为“表格”和“主席”。

我甚至不确定如何在SQL中执行此操作。但我想知道是否有一个可以实现我想要的结构。这似乎是一种干净的编码方式。

最终目标是一个系统,SKU将包含许多不同的项目组合,我希望能够通过输入项目组合来缩小可能的SKU。

E.G如果我搜索Table + 1椅子,我会看到Table& 4把椅子和桌子+ 2把椅子(插入后)等。或桌子+椅子+岛屿+凳子+冰箱

由于

2 个答案:

答案 0 :(得分:1)

这需要对文档进行一些深入研究。

Zoidberg是正确的,GORM默认为一套。我曾经使用过Collection,因为我的理解是,这是一个无序列表,可能包含重复项。 The documentation让我尝试列表。列表允许重复。它确实提到了使用列表的性能,所以也请阅读该部分。这是我最初使用Collection的原因,但这似乎不能正常工作。

另一个问题是如何基于部分列表进行查询。 E.G返回所有具有项目"主席"的SKU。出现在某个地方。

This SO answer ended up being my solution to that piece.

所以这是我的示例代码。

class Item implements Serializable{
    String name;
    String description;

}

class Sku {
    String description;
    String skuCode;
    List items;
    static hasMany = [items:Item];
    }

//… GENERATE TEST DATA
item = new Item(name:"Table", description:"Oak table");
item.save();

item = new Item(name:"Chair", description:"Oak chair");
item.save();

sku= new Sku(description:"A complete dining room set for 4");
sku.items = [Item.findByName("Table"),Item.findByName("Chair"),
                 Item.findByName("Chair"),Item.findByName("Chair"),
                 Item.findByName("Chair")];
sku.save();

//Query test data
Sku.executeQuery("FROM Sku as s WHERE :item in elements(s.items)",
    [item: Item.findByName("Chair")]) 
//returns List<Sku> of any Sku's that contain the item "chair". 
//I need to create a version that takes a list, so I can narrow the search.
如果我尝试使用findByItemsInList或任何其他findBy *,那么使用GORM的

This issue in Jira与我得到的非常类似。

答案 1 :(得分:0)

您正在添加相同的项目4次(主席)。

sku.items = [Item.findByName("Table"),Item.findByName("Chair"),
                     Item.findByName("Chair"),Item.findByName("Chair"),
                     Item.findByName("Chair")];

但默认情况下,GORM会创建一个Set。看到: http://grails.github.io/grails-doc/latest/ref/Domain%20Classes/hasMany.html

并且集合不能包含重复项。如果你想保持计数,你可以添加一个整数来计算你的项目,如果你使用它就增加/减少它。

或者根据需要创建名称为“chair”的任意数量的项目。