I have a List of interface type Criteria within my class Query.
List criteria = new ArrayList
An interface is halfway to the strategy pattern! To vary the logic based on type, push it behind the interface if possible, such that Criteria has a doLogic(). You can pass that method whatever parameters you might need to alter in the calling code, or return new information - that is very implmentation specific and hard to advice on from the code in question.
If all goes well, your calling code ends up
for (Criteria c : criteria) {
c.doLogic();
}