J'essaie de créer des filtres dynamiques à l'aide de findAll sur une liste. J'ai une variable qui doit être incluse dans le filtre uniquement si elle n'est pas nulle.
@Test
void testSample(){
def list = [ new Employee(age:22, isManager:false),
new Employee(age:23, isManager:true),
new Employee(age:22, isManager:true) ] as Set
def var = 22;
String query1 = "it.age == var && it.isManager == true "
String query2 = "it.isManager == true"
println list
println list.findAll { var ? query1 : query2 } // Should give 1 record age = 22 and manager
var = null;
println list.findAll { var ? query1 : query2 } // should give 2 records-only manager
}
Les deux donnant tous les enregistrements. Est-ce que je peux quand même y parvenir dans une condition sans avoir à écrire plusieurs requêtes?
En regardant certains comme ci-dessous (cela ne fonctionne pas bien)
println list.findAll{
if(var) it.age == var &&
it.isManager == true
}
Essayez avec des fermetures plutôt que des chaînes décrivant ce que vous voulez faire:
def list = [ new Employee(age:22, isManager:false),
new Employee(age:23, isManager:true),
new Employee(age:22, isManager:true) ] as Set
def var = 22;
Closure query1 = { it.age == var && it.isManager == true }
Closure query2 = { it.isManager == true }
println list
println list.findAll( var ? query1 : query2 ) // Should give 1 record age = 22 and manager
var = null;
println list.findAll( var ? query1 : query2 ) // should give 2 records-only manager
Tu veux dire:
println list.findAll{ ( var ? it.age == var : true ) && it.isManager == true }
Ou mieux:
println list.findAll{ ( var != null ? it.age == var : true ) && it.isManager == true }