Grails中自动递增整数字段

时间:2012-01-20 17:39:50

标签: grails auto-increment

我在Grails域对象中有字段int displayOrder = 1,并希望每次保存域对象时将其递增1。

如果我有与Pix有一对多关系的域对象Widget,每次Widget获得一个新的Pix时,Pix需要增加displayOrder。

最谨慎的做法是什么?优选地,count应该从1开始,以在有人想要改变显示顺序时将混淆保持为最小。我想只是重复ID,但是我们可能会看到1123的displayOrder,然后是1169等等,所以这不是一个实用的选择。

属于Widget的Pixes集合是一个sortedSet。

2 个答案:

答案 0 :(得分:2)

您还可以执行命名查询以获取Pixes的最后一个最大值,这将适用于显示顺序具有跳过和跳转的情况。

class Widget {
    static hasMany = [pixes: Pix]
    ...
}
class Pix {
    static belongsTo = [widget: Widget]

    static namedQueries = {
        selectMaxDisplayOrderForWidget { widgetInstance ->
            eq('widget', widgetInstance)
            projections {
                max('displayOrder')
            }
            uniqueResult = true
        }
    }
    ...
}

然后:

def widget = retrieveOrCreateWidget()
def pix = new Pix(propertyA: "A", ..., displayOrder: Pix.selectMaxDisplayOrderForWidget(widget).list(), widget: widget)

如果您想在删除Pix之后重新初始化显示订单号,那么它们对于Widget是连续的,根据您对@Jarred Olson的评论,您可以执行以下操作:

Pix.findAllByWidgetAndDisplayOrderGreaterThan(widget, deletedPixDisplayOrder, [sort:'displayOrder',order:'asc']).eachWithIndex { pixInstance, idx ->
    pixInstance.displayOrder = deletedPixDisplayOrder + idx
    pixInstance.save()
}

答案 1 :(得分:1)

我认为你的代码看起来像这样:

class Widget {
    static hasMany = [pixes: Pix]
    ...
}
class Pix {
    static belongsTo = [widget: Widget]
    ...
}


def widget = retrieveOrCreateWidget()
def pix = new Pix(propertyA: "A", ..., displayOrder: 1, widget: widget)
pix.save()
widget.addToPixes(pix)
widget.save()

您可以通过像素的大小来确定displayOrder:

def widget = retrieveOrCreateWidget()
def pix = new Pix(propertyA: "A", ..., displayOrder: widget.pixes.size() + 1, widget: widget)

编辑:

如果你需要做的就是能够在创建Widget的像素时对它们进行排序,你可以将dateCreated添加到Pix。创建Pix时,Grails会自动设置此项。然后,在添加和删除时,您不必增加/减少该值。