2014-04-24 12 views
6

Ho due dominiricerca registra le basi sulle più recenti record in un rapporto hasMany

class DomainA { 
    String name 
    Date dateCreated 
    Date lastUpdated 

    static transients = ['email'] 

    static hasMany = [domainBs: DomainB] 

    public String getEmail() { 
     DomainB.mostRecentRecord(this).get()?.email 
    } 
} 

e

class DomainB { 
    String email 
    Date dateCreated 
    Date lastUpdated 

    static belongsTo = [domainA: DomainA] 

    static namedQueries = { 
     mostRecentRecord { domainA -> 
      eq 'domainA', domainA 
      order('dateCreated', 'desc') 
      maxResults(1) 
     } 
    } 
} 

La mia esigenza è quella di ottenere l'elenco di tutti DomainA cui nome inizia con "M" e l'ultimo record di dominioBs contiene gmail nella loro proprietà di posta elettronica.

Ho provato createCriteria e hql ma non ho ottenuto il risultato desiderato, potrebbe essere che sto facendo qualcosa di sbagliato.

seguito è il mio codice corrente

List<DomainA> listA = DomainA.findAllByNameIlike("M%") 
List<DomainB> listB = [] 
listA.each { entity -> 
    DomainB domainB = DomainB.mostRecentRecord(entity).get() 
    if (domainB && (domainB.email.contains('gmail'))) { 
     listB.add(domainB) 
    } 
} 

ma non permette di impaginazione e di ordinamento.

Qualcuno può avere un'idea per ottenere l'elenco di tutti i domini DomainA il cui nome inizia con "M" e gli ultimi domini contiene Gmail nella loro proprietà e-mail utilizzando createCriteria o hql o in qualsiasi altro modo.

risposta

4

Dato che stai cercando l'email più recente, devi guardare la data massima creata sul tuo secondo dominio. Puoi scriverlo usando HQL e usando executeQuery per passare i tuoi parametri di paginazione. Assicurati di avere un indice sul tuo dateCreated.

FirstDomain.executeQuery("select fd from FirstDomain fd,SecondDomain sd where \ 
     sd.firstDomain.id=fd.id and fd.name like :name and sd.email like :email \ 
     and sd.dateCreated = (select max(sd2.dateCreated) from SecondDomain sd2 \ 
      where sd2.firstDomain.id = fd.id))", 
[email:'%gmail%',name:'M%'], [max: 10, offset: 0]) 

sample code: basta premere il firstDomainController

 def fd 
     // most recent email is gmail 
     fd = new FirstDomain(name:"Mtest") 
     fd.addToSecondDomain(new SecondDomain(email:'yahoo.com')) 
     fd.addToSecondDomain(new SecondDomain(email:'gmail.com')) 
     fd.save(flush:true) 

     // most recent is yahoo 
     fd = new FirstDomain(name:"MMtest") 
     fd.addToSecondDomain(new SecondDomain(email:'gmail.com')) 
     fd.addToSecondDomain(new SecondDomain(email:'yahoo.com')) 
     fd.save(flush:true) 

     // will return "Mtest" 
     FirstDomain.executeQuery("select fd from FirstDomain fd,SecondDomain sd where sd.firstDomain.id=fd.id and fd.name like :name and sd.email like :email and sd.dateCreated = (select max(sd2.dateCreated) from SecondDomain sd2 where sd2.firstDomain.id = fd.id))",[email:'%gmail%',name:'M%']) 
+0

Questa query mi fornisce ogni volta una lista vuota. – user1690588

+0

Avete i dati per soddisfare i requisiti? la query è case sensitive. Ho praticamente usato i tuoi domini e creato alcuni dati di esempio e testato. Stasera controllerò il codice per github. – Alidad

+0

Sono stato creato un'istanza DomainA con il nome 'Manish' e l'istanza DomainB con l'e-mail' test @ gmail.com' e la query mi fornisce una lista vuota. In attesa del repository. Grazie – user1690588

1

In Grails 2.4, si dovrebbe essere in grado di fare qualcosa di simile utilizzando la nuova funzionalità subquery correlata:

DomainA.where { 
    name like 'M%' && exists DomainB.where { 
     id == max(id).of { email like '%gmail%' } 
    } 
} 

Purtroppo, non sono stato in grado di testare la nostra applicazione in 2.4 quindi non posso confermare se questo funzionerà.

+0

Sto usando grails 2.3.5, la tua query mi dà errore, ho corretto questo utilizzando http://grails.org/doc/2.3.7/guide/GORM.html#where documentazione di Queries. La tua query mi dà un risultato errato. Include istanze DomainA il cui DomainB più recente è gmail ma ha un gamil nei vecchi record. – user1690588