2013-06-04 97 views
1

讓說,我有一個通用的方法使用JPA,列出實體檢索通用實體的主鍵列定義JPA

public <T> List<T> list(Class<T> entity) throws Exception { 

     List<T> result = new ArrayList<T>(); 
     CriteriaBuilder builder = em.getCriteriaBuilder(); 

     CriteriaQuery<T> query = builder.createQuery(entity); 
     Root<T> root = query.from(entity); 

     query.select(root); 

     //possible? 
     query.orderBy(builder.asc(...)); 

     result = em.createQuery(query).getResultList(); 

     return result; 
    } 

反正有沒有爲我們orderby添加到查詢並使其ORDER BY主鍵沒有指定主列作爲表達式?我的意思是,在JPA中是否存在Key/Constant或其他任何實體的主鍵列,或者是一個用於檢索它的util方法?

回答

8

此信息可通過metamodel獲取。東西如下應奇異id屬性的情況下工作(沒有測試過,所以可能存在一些問題,尤其是仿製藥,但方式一般是這樣):

public <T> SingularAttribute<? super T, ?> getIdAttribute(EntityManager em, 
                  Class<T> clazz) { 
    Metamodel m = em.getMetamodel(); 
    IdentifiableType<T> of = (IdentifiableType<T>) m.managedType(clazz); 
    return of.getId(of.getIdType().getJavaType()); 
} 

//usage 
SingularAttribute idAttribute = getIdAttribute(em, entity); 
Path<?> pathToId = root.get(idAttribute); 
query.orderBy(builder.asc(pathToId)); 

當使用IdClass實體也應得到支持,解決方案有點複雜,但可以使用IdentifiableType提供的方法。

+0

工程就像一個魅力!萬分感謝! – Quincy