我想知道我是否可以进行一次createCriteria()
调用,它会返回整个表格,以及一些指定的连接列。
这样的事情:
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")
}
}
它返回一个数组数组,包含投影闭包内列出的这3个属性。但是我该怎么做才能收到整个MyDomainClass
对象行和投影?
实际上,我真正需要的是一个包含整个MyDomainClass
对象的数组,以及nestedProperty
中的relationedObject
。
我知道我可以在不指定投影的情况下再做一次createCriteria()
调用,并在代码中手动“加入”它们,但这对我来说看起来很丑陋......任何想法?
我正在使用grails 2.5.5
答案 0 :(得分:2)
我认为Hibernate没有办法完成你正在做的事情(在我看过的文档中没有任何内容),因为你使用HibernateCriteriaBuilder
,我会说不。 / p>
我认为您的替代方案是在投影中定义所有域类的属性,具体取决于您可以手动或在某些帮助下执行此操作所涉及的属性数量:
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
结果转换器返回一个映射。我认为这通常是一个好主意,特别是在处理更大的结果集时;我认为以自动方式收集房产绝对至关重要。这确实需要property(<String>, <String>)
方法调用,而不仅仅是`property()',第二个参数是map键。