У меня есть приложение базы данных Java, использующее hibernate, с разными классами, которые имеют одинаковые атрибуты (здесь: «активный»). В интерфейсе есть функция, которая извлекает записи из базы данных на основе такого атрибута (активный). До сих пор я делал это:
//interface
public interface ObjSvcIntf {
default <Entity> ArrayList<Entity> get(Boolean active);
}
//implementation 1
public class ObjCarSvc implements ObjSvcIntf {
@SuppressWarnings("unchecked")
@Override
public ArrayList< ObjCar > get(Boolean active) {
@SuppressWarnings("rawtypes")
Query query = DB.s.createQuery("from " + ObjCar.class.getSimpleName() + " where active = :active");
query.setParameter("active", active);
if (!query.list().isEmpty()) {
return (ArrayList< ObjCar >) query.list();
} else {
return null;
}
}
//implementation 1
public class ObjPersonSvc implements ObjSvcIntf {
@SuppressWarnings("unchecked")
@Override
public ArrayList< ObjPerson > get(Boolean active) {
@SuppressWarnings("rawtypes")
Query query = DB.s.createQuery("from " + ObjPerson.class.getSimpleName() + " where active = :active");
query.setParameter("active ", active);
if (!query.list().isEmpty()) {
return (ArrayList< ObjPerson >) query.list();
} else {
return null;
}
}
Как видите, в каждом реализующем классе много избыточного кода, которого я хотел бы избежать. Поэтому вместо этого я хотел бы иметь общую функцию по умолчанию в интерфейсе, которая будет возвращать то же самое для каждой реализации интерфейса (если, конечно, не переопределена реализующим классом). Т.е. как-то так (кроме этого, конечно, не работает):
public interface ObjSvcIntf {
default <Entity> ArrayList<Entity> get(Boolean active) {
@SuppressWarnings("rawtypes")
Query query = DB.s.createQuery("from " + Entity.class.getSimpleName() + " where active = :active");
query.setParameter("active", active);
return (ArrayList<Entity>) query.list();
}
}
Мне не хватает правильного понимания здесь, как правильно создать функцию в интерфейсе, чтобы иметь возможностьиспользовать его в разных контекстах / разных классах.
Как вместо этого настроить функцию в интерфейсе, чтобы это произошло?