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>) 方法调用,而不仅仅是 `属性()',第二个参数是映射键。