2014-04-24 1 views
6

J'ai deux domainesrecherche Documents bases sur le dernier enregistrement dans une relation hasMany

class DomainA { 
    String name 
    Date dateCreated 
    Date lastUpdated 

    static transients = ['email'] 

    static hasMany = [domainBs: DomainB] 

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

et

class DomainB { 
    String email 
    Date dateCreated 
    Date lastUpdated 

    static belongsTo = [domainA: DomainA] 

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

Mon exigence est d'obtenir la liste de tous DomaineA dont le nom commence par « M » et Le dernier enregistrement domainBs contient Gmail dans sa propriété de messagerie.

J'ai essayé createCriteria et hql mais je n'ai pas obtenu le résultat souhaité, peut-être que je fais quelque chose de mal.

Après mon code actuel

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) 
    } 
} 

mais il ne permet et trier la pagination. Quelqu'un peut-il avoir une idée pour obtenir la liste de tous les DomainA dont le nom commence par "M" et le dernier domainBs contient gmail dans leur propriété d'email en utilisant createCriteria ou hql ou toute autre manière.

Répondre

4

Puisque vous êtes à la recherche de l'email le plus récent, vous devez regarder la date maxCreated sur votre secondDomain. Vous pouvez l'écrire en utilisant HQL et en utilisant executeQuery pour passer vos paramètres de pagination. Assurez-vous simplement d'avoir un index sur votre 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: vient de frapper le 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

Cette requête me donne une liste vide à chaque fois. – user1690588

+0

Avez-vous les données pour répondre aux exigences? la requête est sensible à la casse. J'ai pratiquement utilisé vos domaines et construit des exemples de données et les ai testés. Je vais vérifier le code pour github ce soir. – Alidad

+0

Je suis créé DomainA instance avec le nom 'Manish' et l'instance DomainB avec l'email' test @ gmail.com' et la requête me donne la liste vide. En attente du référentiel. Merci – user1690588

1

En Grails 2.4, vous devriez être en mesure de faire quelque chose comme ceci en utilisant la nouvelle fonctionnalité de sous-requête corrélative:

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

Malheureusement, je n'ont pas été en mesure de tester notre application en 2.4, donc je ne peux pas confirmer si cela fonctionnera.

+0

J'utilise grails 2.3.5, Votre requête me donne l'erreur, je l'ai corrigé en utilisant http://grails.org/doc/2.3.7/guide/GORM.html#whereQueries documentation. Votre requête me donne un résultat incorrect. Cela inclut les instances de DomainA dont le plus récent DomainB est ot gmail mais qui ont un gamil dans les anciens enregistrements. – user1690588

Questions connexes