Grails Hibernate标准 - 检查是否存在关系

时间:2015-08-10 09:42:34

标签: hibernate grails

我尝试执行过滤器以查找某个对象是否与另一个对象有关系。我有一个对象Component

class Component { 
    long id
    String name
}

Page使用了一个Component。

class Page {
    long id
    static hasMany = [components : Component]
}

我如何构建一个hibernate标准来检查我的组件是否与任何页面有关系?许多页面都可以使用一个组件。到目前为止,我能想到的只有:

Component.createCriteria().list {
    inList("id", Page.list().components);
}

但这根本不会很好地扩展。所以我想知道是否有更简单的说法"如果我的对象被这个对象使用"?

3 个答案:

答案 0 :(得分:1)

Page.createCriteria().count {
    components {
        eq("id", yourComponent.id)
    }
}

此查询为您提供包含yourComponent的所有页面的计数。如果这是0,那么yourComponent不与任何页面相关联。

修改____________________________________________________________

不,因为ComponentPage无关。

但如果你想要这个,那么我的建议是formula column。在此关系中,您有三个表componentpage和关系表page_components

例如,

class Component { 
    long id
    String name
    Boolean isRelatedWithAnyPage

    static mapping = {
        isRelatedWithAnyPage formula: "(select (count(*)>0) from page_components pc where pc.component_id = id)"
    }
}

注意: - 我没试过这个,可能你需要更改公式中的sql查询。

答案 1 :(得分:0)

另一种方法是创建一个PageComponent域来匹配grails自动创建的基础连接表并执行PageComponent.countByComponentId(componentId)

答案 2 :(得分:0)

您可以将exists与子查询一起使用。

def subQuery = Page.where({
   components {
      eqProperty("id", "this.id") //this: is the root alias which refers to the Component
   }
   setAlias("page")
})


Component.createCriteria().list {
  exists(subQuery.id())
}

请参阅how to execute exists subqueries with grails criteria