Самый простой способ - передать имя запроса конструктору абстрактного DAO:
public DaoAbstreact(Class myClass, String findByNameQueryName) {
this.myClass = myClass;
this.findByNameQueryName = findByNameQueryName;
}
Затем определите общедоступную статическую итоговую строку в городе для имени:
public class ConcreteCityDao<City,Long> extends DaoAbstreact {
ConcreteCityDao(){
super(City.class, City.FIND_BY_NAME_QUERY_NAME));
}
}
В качестве альтернативы вы можете объявить DaoAbstreact абстрактным, а затем добавить такой метод:
public abstract String getFindByNameQueryName();
И реализовать это в ConcreteCityDao.
Наконец, вы также можете ввести перечисление:
public enum NamedEntityType {
CITY(City.class, "findCityByname"),
PERSON(Person.class, "findPersonByname");
private final Class<?> entityClass;
private final String findByNameQueryName;
private NamedEntityType(Class<?> entityClass, String findByNameQueryName) {
this.entityClass = entityClass;
this.findByNameQueryName = findByNameQueryName;
}
public Class<?> getEntityClass() {
return entityClass;
}
public String getFindByNameQueryName() {
return findByNameQueryName;
}
}
Тогда ваш DAO может определить тип из переданного класса. Чтобы убедиться, что вы не забыли добавить объект в перечисление, вы можете заставить каждый объект реализовать интерфейс с помощью метода getNamedEntityType (). Затем вы можете указать, что ваш абстрактный универсальный DAO будет принимать только объекты, реализующие этот интерфейс.