2017-10-17 10 views
0

Je tente de faire abstraction de ce bloc supérieur de code pour ressembler au bloc de code inférieur.Comment créer une fonction personnalisée qui renvoie une méthode de fermeture de critères de graissage

if (params.xId) { 
    and { 
     'in'(aggregateClassReference, hierarchy['x']) 
     eq(aggregateIdReference, params.xId as Long) 
    } 
} 
if (params.yId) { 
    and { 
     'in'(aggregateReference, hierarchy['y']) 
     eq(aggregateIdReference, params.yId as Long) 
    } 
} 

...

if (params.xId) { belongsToHierarchy('x', params.xId as Long) } 
if (params.yId) { belongsToHierarchy('y', params.yId as Long) } 

J'utilise les requêtes critères de Gorm, mais je ne veux pas que ces gros morceaux de code. Existe-t-il un moyen de renvoyer une fermeture de ces requêtes de critères dans une fonction personnalisée? Le problème est maintenant droit je mets les morceaux ci-dessous du code dans

def criteria = DetachedCriteria.build(...) 

Ensuite je fais un

criteria.list(...) 

à exécuter. Ce serait génial de revenir en quelque sorte une fermeture de juste la

and { 
    'in'{...} 
    eq {...} 
} 

dans une fonction personnalisée au sein de la construction, mais je n'ai pas été en mesure de comprendre cela encore. Un peu nouveau pour les grails. Toute idée pour me guider serait très appréciée :)

+1

Peut-être que les requêtes nommées pourrait aider? Avez-vous regardé dans eux? http://docs.grails.org/latest/ref/Domain%20Classes/namedQueries.html –

Répondre

1

Il y a plusieurs façons de faire à ce sujet. Vous n'avez pas montré suffisamment de contexte pour se concentrer exactement sur la meilleure solution à ce que vous faites, mais étant donné ce que je peux vous montrer, cela peut aider.

Si vous voulez utiliser des requêtes de critères, au lieu de quelque chose comme ça ...

def results = SomeDomainClass.withCriteria { 
    if (params.xId) { 
     and { 
      'in'(aggregateClassReference, hierarchy['x']) 
      eq(aggregateIdReference, params.xId as Long) 
     } 
    } 
    if (params.yId) { 
     and { 
      'in'(aggregateReference, hierarchy['y']) 
      eq(aggregateIdReference, params.yId as Long) 
     } 
    } 
} 

Vous pouvez faire quelque chose comme ça ...

def results = SomeDomainClass.withCriteria { 
    if (params.xId) { 
     belongsToHierarchy 'x', params.long('xId'), delegate 
    } 
    if (params.yId) { 
     belongsToHierarchy 'y', params.long('yId'), delegate 
    } 
} 

// ... 

// it isn't clear from your example if 
// aggregateClassReference and hierarchy are local 
// variables in the context where the criteria 
// query is being initialized or if they are 
// instance variables. If they are instance variables 
// the code below will work. If they are local 
// variables then they might need to be passed as 
// arguments into this belongsToHierarchy method... 

void belongsToHierarchy(String arg, long id, delegate) { 
    def query = { 
     // not sure why you had the "and" in your example, but 
     // I will leave it here assuming there is a reason... 
     and { 
      'in' aggregateClassReference, hierarchy[arg] 
      eq aggregateIdReference, id 
     } 
    } 
    query.delegate = delegate 
    query() 
} 
+0

J'ai montré une requête de critères parce que c'est ce que vous avez utilisé dans votre question. En fonction de certains détails qui ne sont pas clairs dans la question, une autre option avec de bons avantages pourrait être de tirer parti du fait que les requêtes de critères détachées peuvent être composées. –