一尘不染

在抽象的JPA DAO中抽象命名查询

hibernate

我有一个抽象的DAO类,它使用参数化类型E(实体)和K(主键)。在每个实体中我都有一个@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;
        }
    }

    // ...
}

阅读 220

收藏
2020-06-20

共1个答案

一尘不染

<Entity Name>.findBy<PropertyAndAnotherProperty>在您的示例中,命名查询的命名约定通常为“
City.findByName”,因此,我将尝试更改命名查询以遵循此模式。然后,此查询的参数也应具有相同的名称,否则您可以使用位置参数。您的查找方法将变成

@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;
    }
}
2020-06-20