Grails GORM的一元关系

时间:2015-08-05 06:21:22

标签: grails gorm

基于此GORM Domain类:

?- list_nextmin_gt([3,2,1,2,3], M, _).
(  M = 1
;  M = 2
;  M = 3
;  false
).

我的问题是:

  1. 在这种情况下,我们如何将Domain类引用给自己 class Component implements Serializable { Long id String name Double total Long parentComponentId static mapping = { ... } static constraints = { ... parentComponentId nullable: true } } parentComponentId的另一个实例。
  2. 如果解决了#1中的引用问题,我该如何执行类似于此的查询:
      

    Component

2 个答案:

答案 0 :(得分:1)

只需将Long parentComponentId更改为Component parentComponent即可。您也不需要Long id属性,因为Grails会为您添加:

class Component implements Serializable {
    String name
    Double total
    Component parentComponent

    static constraints = {
        parentComponent nullable: true
    }
}

然后您可以访问父组件和父组件ID:

assert Component.read(1).parentComponentId == Component.read(1).parentComponent.id

如果您想要级联删除,则需要删除parentComponent属性并添加:

static hasMany = [nestedComponents: Component]
static belongsTo = [parentComponent: Component]

我假设你有0:N关系,如果不是,你需要改变它。检查the documentation for defining associations

至于你的第二个问题,遗憾的是你还没有在标准中使用havinghttps://jira.grails.org/browse/GRAILS-7880

您可以使用HQL执行此操作:

Component.executeQuery("""
   select parent from Component parent, Component nested
   where nested.parentComponent = parent
   group by parent
   having parent.total = sum(nested.total)
""".toString())

答案 1 :(得分:0)

你可以在第一个问题上这样做。

class Component implements Serializable {
    Long id
    String name
    Double total
    static belongsTo = [parentComponentId:Component]
    static mapping = {
        ...
    }

    static constraints = {
        ...
        parentComponentId nullable: true
    }
}