具有许多相同类型和重复条目的 Grails GORM 域 class

Grails GORM domain class with hasMany of same type and duplicate entries

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

E.G

餐厅套装的 SKU 为 4(商品)"chair" 和 1(商品)"table"。如果我能让 GORN 认识到它与 "chair" 的多个实例相关联,那么我就可以继续计数。

这是我试过的基本代码

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();

这只会显示 "Table" 和 "Chair" 的 SKU。

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

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

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

谢谢

您正在添加相同的项目 4 次(椅子)。

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

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

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

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

这需要深入研究文档才能弄明白。

Zoidberg 说得对,GORM 默认为一组。我曾经使用过 Collection,因为我的理解是,这是一个可以包含重复项的无序列表。 The documentation 带我试试 List。列表允许重复。它确实提到了使用列表的性能,因此也请阅读该部分。这是我最初使用 Collection 的原因,但它似乎并不像我需要的那样工作。

另一个问题是如何根据部分列表进行查询。例如 Return 某处存在商品 "Chair" 的所有 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.
GORM 的

This issue in Jira 与我尝试使用 findByItemsInList 或任何其他 findBy* 时得到的结果非常相似。