2016-01-21 94 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