Question

D'abord, je dois m'excuser pour le long post, je me suis mal à la fois avec trop de verbe et pourtant pas toujours assez clair. J'ai également beaucoup cherché à une solution élégante pour mon problème et si je l'ai manqué, veuillez me diriger vers moi.

de fond:
J'ai une application Grails qui utilise NamedQuies pour un ensemble de jeux de résultats standard. L'application trouve des commandes d'emploi annoncées ouvertes dans notre système et les envoie à d'autres sites. Récemment, une exigence supplémentaire est devenue un problème pour moi si je souhaite continuer à utiliser la namaMequeries.

Pour des raisons de simplicité, supposons simplement un modèle de domaine de

    class JobOrder {

  def getOpenAdJobsSql() {
    def qry = "select jo FROM JobOrder jo WHERE isOpen=1 AND publishedTo='All External' AND adCategory.isActive=1 AND jo.adLocation in (select zc.id from Zip zc)"

    JobOrder.executeQuery(qry)

  }

  static namedQueries = {

    openAdJobs {
      eq 'isOpen', true
      eq 'publishedTo', "All External"
      adCategory {
        eq 'isActive', true
      }
    }

  static mapping = {
    table 'dbo.JOBORDER'
    version false
    id generator: 'identity', column: 'JOBORDERID'
    isOpen column: 'ISOPEN'
    publishedTo column: 'customText15'
    adLocation column: 'PUBLISHEDZIP'
    adCategory column: 'customInt3'
  }

  Boolean isOpen
  String publishedTo
  String adLocation
  ClientCorporation client
  AdCategory adCategory

  static constraints = {
    adLocation(size: 0..100)
  }

}

    class AdCategory {    
  static mapping = {
    table 'dbo.AdCategory'
    version false
    id generator: 'identity', column: 'adCategory_ID'
    isActive column: 'active'
  }
}

    class Zip {
    static mapping = {
        table 'ZIP'
        version false
        id generator: 'identity', column: 'ZIPCODE'
        city  column: 'city'
        county  column: 'county'
        stateAbbr column: 'statecode'
    }

    String city
    String county
    String stateAbbr
}

Je commencerai par l'actuelle NamedQuery en préoccupation:

openAdJobs {
  eq 'isOpen', true
  eq 'publishedTo', "All External"
  adCategory {
    eq 'isActive', true
  }
}

Cette requête existe dans mon objet d'emploi de domaine d'emploi qui a également une relation avec l'objet de domaine Adcategory. La requête nommée est appelée dans plusieurs endroits en utilisant l'appel suivant:

def openJobs = JobOrder.openAdJobs

mon nouveau problème:
Maintenant, j'ai une exigence de veiller à ne pas publier d'emplois qui ont des codes postaux non valides. J'intègre avec un produit qui ne contient aucune validation zip et je n'ai aucun contrôle sur le modèle de domaine natif du produit. Nous avons ajouté un objet de domaine zip personnalisé qui est seul. J'ai eu des difficultés à comprendre un moyen d'inclure le code qui fonctionnera avec la requête nommée dans mon objet d'emploi pour accomplir ce que la requête suivante reviendrait: (i Exécution de cette requête contre le SQL DB dans dbvisualizer)

  select * from dbo.JobOrder jo  
  inner join dbo.AdCategory ac on jo.adCategory=ac.adCategory_ID  
  where  
  jo.isOpen=1  
  and  
  jo.publishedTo='All External'  
  and  
  ac.isActive=1  
  and  
  jo.publishedZip in (  
        select zc.zipcode from dbo.Zip zc  
  ) 

une solution pas si jolie:

La seule façon dont je et quelques pairs ont obtenu l'ensemble de résultats souhaitée consiste à créer une méthode comme ci-dessous dans mon objet d'emploi:

def getOpenAdJobsSql() {
    def qry = "select jo FROM JobOrder jo WHERE isOpen=1 AND publishedTo='All External' AND adCategory.isActive=1 AND jo.adLocation in (select zc.id from Zip zc)"

    JobOrder.executeQuery(qry)
}  

La méthode, bien sûr, n'est pas disponible à moins d'instanciation d'un nouvel emploi. Depuis que je tente réellement de construire ma liste de changeurs à ce stade, il existe un hack très peu attrayant pour obtenir mon ensemble de résultats. J'aurais besoin d'aller chercher un bon travail connu (ou de créer une) afin que la méthode getopenadjobssql () soit disponible pour appeler.

quelque chose comme:

def jo = JobOrder.get(2)
def rset = jo.openAdJobsSql

devrait être ajouté partout où j'appelle actuellement la requête OpenAdjobs (actuellement 9 ou plusieurs usages). Pour même que cette approche envoie une avertissement mentale évasait pour moi, mais je ne vois aucune autre façon d'ajouter la fonctionnalité supplémentaire.

Encore une fois, il est finalement mon désir d'appeler une requête nommée, mais le code postal supplémentaire SQL semble être quelque chose de gorm + hibernate ne sera pas capable de gérer.

J'espère que quelqu'un saura une solution plus élégante. Et s'il vous plaît demander une clarté partout où il manque dans ce post.

Était-ce utile?

La solution

D'accord, donc si je comprends votre problème:

  1. L'appréciation, plus spécifiquement, la table d'emploi sous-jacente et le mécanisme permettant de remplir ce tableau, est un produit tiers. Vous ne pouvez pas changer non plus.
  2. Les lignes de l'œuvrier peuvent contenir des valeurs publiées qui n'existent pas dans votre table zip.
  3. Votre modèle de gorm actuel ne contient pas de relation entre l'œuvrier et le zip afin que vous ne puissiez donc pas utiliser de critère / hql pour sélectionner un sous-ensemble des données contenant uniquement des codes postaux valides.

    options pouvant fonctionner:

    • Faites la méthode que vous avez décrite statique afin que vous n'ayez pas besoin d'instancier un objet de la classe sous-jacente.
    • Utilisez la restriction inlist sur votre requête nommée (je n'ai pas testé cela, mais on dirait que cela devrait fonctionner).

      .

      openAdJobs {
          eq 'isOpen', true
          eq 'publishedTo', "All External"
          inList 'adLocation', Zip.list()
          adCategory {
            eq 'isActive', true
         }
       }
      

      Je pense qu'il y a probablement une alternative mieux performante que vous pourriez utiliser impliquant une expression de sous-requête qui remplace l'inliste avec une clause existante, mais hors de la tête, je ne suis pas sûr que les critères de critère / gorm appuient que ou non. . Vous devrez peut-être vous mettre dans l'hibernate pour le faire et je ne suis pas sûr à quel point cette approche joue avec des requêtes nommées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top