如何以通用方式检查元模型类的字段?

时间:2014-02-21 08:48:45

标签: generics jpa metamodel

我使用带有通用实现的Abstract Base类来使用JPA访问我的数据库。 我也使用实体元模型。

public List<PersonEntity> findByCode(String code) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<PersonEntity> cq = cb.createQuery(PersonEntity.class);
    Root<PersonEntity> root = cq.from(PersonEntity.class);

    Predicate predicate = cb.equal(root.get(PersonEntity_.code), code);
    cq.where(predicate);

    TypedQuery<PersonEntity> query = entityManager.createQuery(cq);
    List<PersonEntity> list = new ArrayList<>();
    return query.getResultList();
}   

我想把它移到一个通用的基类,因为这种代码的和平性使用了很多次。 如何检查是否有“代码”?并非所有课程都有一个。

public List<E> findByCode(String code) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<E> cq = cb.createQuery(entityClass);
    Root<E> root = cq.from(entityClass);

    //here is my problem: how to check if there is a "code"?
    // Most classes have one, but not all.
    Predicate predicate = cb.equal(root.get(PersonEntity_.code), code);
    cq.where(predicate);

    TypedQuery<E> query = entityManager.createQuery(cq);
    List<E> list = new ArrayList<>();
    return query.getResultList();
}

1 个答案:

答案 0 :(得分:1)

你应该声明一个接口(名字更好):

public interface Codeable {
    public String getCode();
}

然后声明方法:

public List<E implements Codeable> findByCode(String code, Class<E> clazz) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<E> cq = cb.createQuery(entityClass);
    Root<E> root = cq.from(entityClass);

    //here is my problem: how to check if there is a "code"?
    // Most classes have one, but not all.
    Predicate predicate = cb.equal(root.get(PersonEntity.getCode()), code);
    cq.where(predicate);

    TypedQuery<E> query = entityManager.createQuery(cq);
    List<E> list = new ArrayList<>();
    return query.getResultList();
}

传递给类类型的参数clazz(为了让编译器知道在查询中实际使用哪种类型以及返回哪种类型):

List<PersonEntity> persons = dao.findByCode("someCode", PersonEntity.getClass());

P.S

我还将.code更改为.getCode()以符合界面。