Я не понимаю, почему вы должны хранить стратегию в БД - стратегия в основном выражается в коде (возможно, с некоторыми параметрами конфигурации, которые, в свою очередь, могут храниться в БД, но для меня это другая проблема).
OTOH Я бы держал значок и его стратегию состояния в одном классе, что устраняет вашу проблему с поиском. В Java хорошей моделью предметной области было бы представление значков в виде перечисления с переопределенным методом, чтобы определить, заработал ли данный пользователь этот конкретный значок.
Обновление Вот пример:
enum Badge {
EPIC() {
public boolean isEligible(User user) {
// determine whether this user is eligible for the Epic badge
}
},
CRITIC() {
public boolean isEligible(User user) {
// determine whether this user is eligible for the Critic badge
}
},
...
;
public abstract boolean isEligible(User user);
}
Но если вы действительно хотите их разделить, то в конструкторе, например, LegendaryBadge
Вы говорите this.strategy = new LegendaryBadgeConditionStrategy();