mysql - Grails 标准投影 - 返回整个表和投影

标签 mysql grails criteria

我想知道是否可以进行一次 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/

相关文章:

mysql - 无法在包含 GROUP BY 的查询中进行 CONCAT

php - MySQL 查询连接

groovy - 在整个 grails 应用程序中保留 url 参数

spring - Grails Ldap记住我IllegalArgumentException

C语言从2个标准中选择一个排序函数

hibernate - 如何使用 Criteria 返回具有选定列的实体

python - 重新启动计算机并获得 : ImportError: No module named django. core.management

mysql - 使用 MySQL 和 JSON 的更新查询

grails - Groovy Grails - 按键从 Map 中检索值的问题

nhibernate - 如何使用 NHibernate 标准执行此操作