我有一个抽象的DAO类,它使用参数化类型E(实体)和K(主键)。在每个实体中我都有一个@NamedQuery。我想动态调用此命名查询而不知道其确切名称和参数名称。
E
K
@NamedQuery
例如,假设以下实体 City
City
@Entity(name="CITY") @NamedQuery( name="findCityByname", query="FROM CITY c WHERE name = :CityName" ) public class City { // ... }
和这个 CityDao
CityDao
public class CityDao extends AbstractDao<City, Long> { public CityDao() { super(City.class); } }
我应该如何实现该findByName()方法,AbstractDao以便不需要知道确切的名称和参数名称?
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; } } // ... }
<Entity Name>.findBy<PropertyAndAnotherProperty>在您的示例中,命名查询的命名约定通常为“ City.findByName”,因此,我将尝试更改命名查询以遵循此模式。然后,此查询的参数也应具有相同的名称,否则您可以使用位置参数。您的查找方法将变成
<Entity Name>.findBy<PropertyAndAnotherProperty>
@Override public E findByName(String name) { E entity = null; try { return (E)entityManager.createNamedQuery(myClass.getSimpleName() + ".findByName") .setParameter("name", name) .getSingleResult(); } catch (Exception ex) { return null; } }