У меня есть абстрактный класс DAO, который использует параметризованные типы E
(Entity) и K
(Primary Key). В каждой сущности у меня есть @NamedQuery
. Я хочу динамически вызывать этот именованный запрос, не зная его точного имени и имени параметра.
В качестве примера, представьте себе следующую сущность City
@Entity(name="CITY")
@NamedQuery(
name="findCityByname",
query="FROM CITY c WHERE name = :CityName"
)
public class City {
// ...
}
и этот CityDao
public class CityDao extends AbstractDao<City, Long> {
public CityDao() {
super(City.class);
}
}
Как мне реализовать метод findByName ()
в AbstractDao
, чтобы я не нуждался в чтобы узнать точное имя и имя параметра?
public abstract class AbstractDao<E, K> implements Dao<E, K> {
@PersistenceContext
protected EntityManager entityManager;
protected Class<E> entityClass;
protected AbstractDao(Class<E> entityClass) {
this.entityClass = entityClass;
}
@Override
public E findByName(String name) {
try {
return (E) entityManager
.createNamedQuery("findCityByName")
.setParameter("CityName", name)
.getSingleResult();
} catch(Exception e) {
return null;
}
}
// ...
}