2016-01-21 92 views
0

我是新来的Grails,并且遇到了一些查询问题。我有两个领域类是这样的:如何创建自定义的Grails查询

class Cliente { 

    String nombre 
    String cuit 
    String localidad 
    String establecimiento 

    static hasMany = [facturas: Factura] 
} 

class Factura { 

    String Proveedor 
    int sucursal 
    String numero 
    String letraFactura 
    Cliente cliente 
    Date fecha 
    String tipo 
} 

我想列出facturas与客户名称的所有元素:

结果预计:

Proveedor|sucursal|numero|cliente_nombre|fecha 

我已经尝试了一些不同的方法,但始终得到cliente_id不是cliente_nombre

+0

这有点不清楚你的目标是什么;你想要一个包含查询返回给定字段的地图吗?为什么当您搜索时,facturas列表需要客户名称? – tylerwal

+0

@tylerwal我想选择Factura表中的所有项目,但用cliente_name替换cliente_id。在MySQL中,我会在Factura和Cliente之间加入一个联盟。我希望我能更清楚一点。 – ConejoNegro

+0

@ConejoNegro把你的问题澄清,即编辑你的问题。 – jogo

回答

0

认为我知道你在问什么:给客户的名称,返回的factura的列表,并规定,字段列表应该包括客户名称,而不是客户端ID。

import org.hibernate.criterion.CriteriaSpecification 

// given a client name 
def clientNameToSearch = 'some name' 

def crit = Factura.createCriteria() 

def results = crit.list() { 
    createAlias('cliente', 'cli') 
    eq('cli.nombre', clientNameToSearch) 

    // optional transformer to output a map rather than a list 
    resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP) 

    projections { 
     property('Proveedor', 'Proveedor') 
     property('sucursal', 'sucursal') 
     property('numero', 'numero') 
     property('cli.nombre', 'clienteNombre') 
     property('fecha', 'fecha') 
    } 
} 

results然后将包含图的列表,具有这种结构的每个地图:

[ 
    Proveedor: ..., 
    sucursal: ..., 
    numero: ..., 
    clienteNombre: ..., 
    fecha: ... 
] 
+0

你为什么要用createAlias?我对我没有意义。如果你想过滤某些东西,只需创建块的条件。这很容易:cliente {eq('nombre',clientNameToSearch)} – quindimildev

+0

就我所知,它本质上是做同样的事情(内部连接在'cliente'表上),所以功能是一样的。我在下面的投影中使用别名,嵌套闭包语法是否支持相同的功能? – tylerwal

+0

并不总是,但在这种情况下,它是。当然结果也是一样,但如果有更干净的做法,为什么不使用它?在可能的情况下,我更喜欢更清晰的代码。对我来说,createAlias是有用的,但在某些情况下,当块不工作时,作为n到m的关系,例如 – quindimildev