我尝试执行过滤器以查找某个对象是否与另一个对象有关系。我有一个对象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);
}
但这根本不会很好地扩展。所以我想知道是否有更简单的说法"如果我的对象被这个对象使用"?
答案 0 :(得分:1)
Page.createCriteria().count {
components {
eq("id", yourComponent.id)
}
}
此查询为您提供包含yourComponent的所有页面的计数。如果这是0,那么yourComponent不与任何页面相关联。
修改____________________________________________________________ 强>
不,因为Component
与Page
无关。
但如果你想要这个,那么我的建议是formula column
。在此关系中,您有三个表component
,page
和关系表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())
}