我想知道是否可以进行一次 createCriteria()
调用,该调用返回整个表以及一些指定的连接列。
像这样:
从 table1 WHERE ... INNER JOIN table2 中选择 table1.*、table2.property1、table2.property2
。
我有一个类似的代码:
MyDomainClass.createCriteria().list{
createAlias("relationedObject", "relationedObjectAlias")
condition1(...)
condition2(...)
condition3(...)
projections{
property("relationedObjectAlias.nestedProperty")
property("someProperty")
property("anotherProperty")
}
}
它返回一个数组数组,其中包含投影闭包内列出的这 3 个属性。但是我应该怎么做才能接收整个 MyDomainClass
对象行以及投影?
实际上,我真正需要的是一个包含整个 MyDomainClass
对象以及 relationedObject
中的 nestedProperty
的数组。
我知道我可以再执行一次 createCriteria()
调用,而不指定投影,并在代码中手动“加入”它们,但这对我来说看起来很难看......有什么想法吗?
我使用的是 grails 2.5.5
最佳答案
我认为 Hibernate 中没有办法完成您正在做的事情(我见过的文档中没有任何内容),因为您正在使用 HibernateCriteriaBuilder
,我会说不。
我认为您的替代方案是在投影中定义域类的所有属性,具体取决于涉及的属性数量,您可以手动或在一些帮助下执行此操作:
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()
是非静态方法上的方法,我不想依赖任何特定实例。我根据自己的测试排除了任何集合。
我使用 ALIAS_TO_ENTITY_MAP
而不是依赖返回的数组和该数组中属性的位置。结果转换器返回 map 。我认为无论如何这通常是一个好主意,特别是在处理更大的结果集时;我认为如果以自动化的方式收集属性,这绝对是至关重要的。这确实需要 property(<String>, <String>)
方法调用而不只是“property()”,第二个参数是映射键。
关于mysql - Grails 标准投影 - 返回整个表和投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43700054/