gpt4 book ai didi

grails - 使用索引属性使一对多关系陷入困境

转载 作者:行者123 更新时间:2023-12-02 14:45:13 25 4
gpt4 key购买 nike

在我的Grails应用中,我有两个具有一对多关系的域类,例如

class Parent    
static hasMany = [children: Child]
}

class Child {
Integer index
static belongsTo = [parent: Parent]
}

我希望 index记录创建子项的相对顺序,这样父项的第一个子项将具有索引1,下一个子项将具有索引2,依此类推。索引不必是连续的,因为子项可以删除,但它们应始终反射(reflect)创建的相对顺序。

我考虑过做类似下面的事情来设置 index属性
class Child {
Integer index
static belongsTo = [parent: Parent]

def beforeValidate() {

def maxIndex = Child.createCriteria().get {
projections {
max('index')
}
eq('parent', parent)
}

this.index = maxIndex + 1 ?: 1
}
}

但是当然这是行不通的,因为它将为两个瞬时 Child实例分配相同的索引。维护此 index属性的最简单方法是什么?

FWIW,我不太担心阻止任何其他代码设置 index,但是如果有某种方法可以做到这一点,那将是一个好处。

最佳答案

我以为你可以做到:

class Parent    
List children
static hasMany = [children: Child]
}

然后将子级保存在一个List中,因此隐式具有索引和顺序。我猜您实际上是希望元素具有索引字段,而不是隐含的顺序吗?

编辑

这可行(似乎),但是每次查询索引时都会访问数据库
class Child {
def grailsApplication

static belongsTo = [ parent: Parent ]

Integer getIndex() {
grailsApplication.mainContext.sessionFactory.currentSession.with { sess ->
createSQLQuery( 'SELECT c.children_idx FROM child c where c.id = :id' )
.setBigInteger( "id", this.id )
.list()
.head() + 1
}
}
String toString() {
"Child @$index"
}
}

并让我感到有点不适;-)

编辑2

当然,另一种选择是:
  Integer getIndex() {
parent.children.indexOf( this ) + 1
}

关于grails - 使用索引属性使一对多关系陷入困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13396678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com