2014-02-21 23 views
0

我使用帶有泛型實現的Abstract Base類來使用JPA訪問我的數據庫。 我也使用實體元模型。如何以通用方式檢查Meta模型類的字段?

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

你或許應該申報(與更好的名稱)的接口:

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(),以符合該接口。

相關問題