Grails 标准预测 - return 整个 table 和预测
Grails criteria projections - return whole table AND the projections
我想知道我是否可以进行一次 createCriteria()
调用,即 returns 整个 table 和一些指定的连接列。
像这样:
SELECT table1.*, table2.property1,table2.property2 FROM table1 WHERE ... INNER JOIN table2
.
我有一个类似这样的代码:
MyDomainClass.createCriteria().list{
createAlias("relationedObject", "relationedObjectAlias")
condition1(...)
condition2(...)
condition3(...)
projections{
property("relationedObjectAlias.nestedProperty")
property("someProperty")
property("anotherProperty")
}
}
它 returns 我是一个数组数组,包含在 projections 闭包中列出的这 3 个属性。但是我应该怎么做才能接收整个 MyDomainClass
对象行和投影?
实际上,我真正需要的是一个包含整个 MyDomainClass
对象和 relationedObject
.
中的 nestedProperty
的数组
我知道我可以再做一次 createCriteria()
调用,而不指定投影,然后在代码中手动 "join" 它们,但这对我来说很难看......有什么想法吗?
我正在使用 grails 2.5.5
我认为 Hibernate 中没有一种方法可以完成您正在做的事情(我所看到的文档中没有任何内容)并且由于您使用的是 HibernateCriteriaBuilder
,我会说不.
我认为您的替代方案是在投影中定义域 class 的所有属性,具体取决于涉及的属性数量,您可以手动或借助一些帮助来完成此操作:
import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
import org.hibernate.criterion.CriteriaSpecification
...
def propertyNames = new DefaultGrailsDomainClass(MyDomainClass.class).
getPersistentProperties().
findAll{ p -> !p.isOneToMany() }*.
name
MyDomainClass.createCriteria().list{
createAlias("relationedObject", "relationedObjectAlias")
condition1(...)
condition2(...)
condition3(...)
resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
projections{
property("relationedObjectAlias.nestedProperty")
propertyNames.each{ pn ->
property(pn, pn)
}
}
}
我不会说它很漂亮,但它可能适合你的情况;我在我的几个领域对象上测试了它并且它成功地工作了。我正在使用 DefaultGrailsDomainClass
因为 getPersistentProperties()
是非静态方法上的方法,我不想依赖任何特定实例。我根据自己的测试排除了任何集合。
我没有依赖 returned 数组和属性在该数组中的位置,而是使用 ALIAS_TO_ENTITY_MAP
结果转换器到 return 地图。我认为这通常是个好主意,尤其是在处理较大的结果集时;我认为以自动化方式收集属性绝对至关重要。这确实需要 property(<String>, <String>)
方法调用,而不仅仅是 `属性()',第二个参数是映射键。
我想知道我是否可以进行一次 createCriteria()
调用,即 returns 整个 table 和一些指定的连接列。
像这样:
SELECT table1.*, table2.property1,table2.property2 FROM table1 WHERE ... INNER JOIN table2
.
我有一个类似这样的代码:
MyDomainClass.createCriteria().list{
createAlias("relationedObject", "relationedObjectAlias")
condition1(...)
condition2(...)
condition3(...)
projections{
property("relationedObjectAlias.nestedProperty")
property("someProperty")
property("anotherProperty")
}
}
它 returns 我是一个数组数组,包含在 projections 闭包中列出的这 3 个属性。但是我应该怎么做才能接收整个 MyDomainClass
对象行和投影?
实际上,我真正需要的是一个包含整个 MyDomainClass
对象和 relationedObject
.
nestedProperty
的数组
我知道我可以再做一次 createCriteria()
调用,而不指定投影,然后在代码中手动 "join" 它们,但这对我来说很难看......有什么想法吗?
我正在使用 grails 2.5.5
我认为 Hibernate 中没有一种方法可以完成您正在做的事情(我所看到的文档中没有任何内容)并且由于您使用的是 HibernateCriteriaBuilder
,我会说不.
我认为您的替代方案是在投影中定义域 class 的所有属性,具体取决于涉及的属性数量,您可以手动或借助一些帮助来完成此操作:
import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
import org.hibernate.criterion.CriteriaSpecification
...
def propertyNames = new DefaultGrailsDomainClass(MyDomainClass.class).
getPersistentProperties().
findAll{ p -> !p.isOneToMany() }*.
name
MyDomainClass.createCriteria().list{
createAlias("relationedObject", "relationedObjectAlias")
condition1(...)
condition2(...)
condition3(...)
resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP)
projections{
property("relationedObjectAlias.nestedProperty")
propertyNames.each{ pn ->
property(pn, pn)
}
}
}
我不会说它很漂亮,但它可能适合你的情况;我在我的几个领域对象上测试了它并且它成功地工作了。我正在使用 DefaultGrailsDomainClass
因为 getPersistentProperties()
是非静态方法上的方法,我不想依赖任何特定实例。我根据自己的测试排除了任何集合。
我没有依赖 returned 数组和属性在该数组中的位置,而是使用 ALIAS_TO_ENTITY_MAP
结果转换器到 return 地图。我认为这通常是个好主意,尤其是在处理较大的结果集时;我认为以自动化方式收集属性绝对至关重要。这确实需要 property(<String>, <String>)
方法调用,而不仅仅是 `属性()',第二个参数是映射键。