2016-04-13 5 views
0

Ich versuche, einen dynamischen SearchService in Grails 2.4.3 einzurichten, um es für alle Domänenklassensuchen zu verwenden.Criteria API dynamisch sortierend

Jetzt komme ich zu dem Problem, die angegebene Sortiereigenschaft aufzulösen, die nicht in der Klasse sind, in der die Kriterien aktiviert sind.

Beispiel: Ich habe eine Foo Klasse, die eine Eigenschaft enthält Bar bar und Bar hat die Eigenschaft String name. Jetzt möchte ich nach dem Namen von Bar sortieren, also bekomme ich als Sortierparameter den Service bar.name.

Jetzt muss ich diesen Sortierparameter dynamisch auflösen, dass ich auch etwas wie world.name verwenden kann.

I this gefunden:

def criteria = Child.createCriteria(); 
println criteria.list{ 
    parent { 
     order("name") 
    } 
} 

Ich versuchte es dynamisch zu machen, hier ist ein Teil meiner Methode:

def c = domainClass.createCriteria() 
def list = c.listDistinct { 
     if (sort) { 
      if (sort.contains('.')) { 
       String[] splittedSort = sort.tokenize('.') 
       sort = splittedSort.last() 
       splittedSort = splittedSort[0..-2] 

       splittedSort[0].toString() { 
        order(sort, sortorder) 
       } 
      } else { 
       order(sort, sortorder) 
      } 
     } 
} 

Dies funktioniert nicht :(

Irgendwelche Vorschläge, wie Ich kann diese Arbeit bekommen?

Antwort

0

Anstatt zu versuchen, eine Methode über eine dynamische aufzurufen Name können Sie einen Kriterienabfragealias verwenden. So:

def c = domainClass.createCriteria() 
def list = c.listDistinct { 
     if (sort) { 
      if (sort.contains('.')) { 
       String[] splittedSort = sort.tokenize('.') 
       sort = splittedSort.last() 
       splittedSort = splittedSort[0..-2] 

       createAlias(splittedSort.join('.'), 'sortAlias') 
       order("sortAlias.${sort}", sortorder) 
      } else { 
       order(sort, sortorder) 
      } 
     } 
} 
Verwandte Themen