2016-12-26 80 views
0

我試圖編寫一些常用方法(Java/Spring/JPA)從數據庫中獲取前N個實體。所有實體都有@Id註釋,但id字段可以有各種名稱。例如,ID爲Table.tableIdPlate.plateId的實體。 tableIdplateId都有@Id註釋,但字段名稱不同(在代碼和數據庫中)。我無法更改字段名稱。我試圖通過JPA Criteria API對asc和setMaxResults進行排序,但是我找不到按id排序的方式。從數據庫中選擇前N個實體的常用方法JPA

import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.EntityManager; 

public class EntityHelper { 

    protected final EntityManager entityManager; 

    public List<ENTITY> getFirstEntities(Class<ENTITY> entityClass, int count) { 
     CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<ENTITY> criteriaQuery = criteriaBuilder.createQuery(entityClass); 
     Root<ENTITY> root = criteriaQuery.from(entityClass); 
     criteriaQuery.select(root); 
//  HOW TO SORT by ID??? criteriaQuery.orderBy(criteriaBuilder.asc()); 

     TypedQuery<ENTITY> query = entityManager.createQuery(criteriaQuery); 
     return query.setMaxResults(count).getResultList(); 
    } 
} 

我需要使用ID進行排序ASC什麼?或者,有沒有其他方法來實現這種方法? JPA 2.1。

+0

列名不必一定與實體字段名。您可以使用[映射的超類](http://stackoverflow.com/a/5258090/1199132)來聲明一個通用的id字段,然後在使用不同id列名稱的每個子類中覆蓋它。或者,您可以嘗試使用界面來做到這一點,但我不確定它會起作用。 –

回答

1

對於使用Hibernate的類似目的,我通過ClassMetadata.getIdentifierPropertyName()獲取實體的id屬性的名稱。使用JPA,似乎同樣能通這樣的事情(我沒有嘗試,只是閱讀的javadoc)來實現:

IdentifiableType identifiableType = (IdentifiableType) entityManager.getMetamodel().managedType(entityClass); 
String idPropertyName = identifiableType.getId(entityClass).getName(); 
criteriaQuery.orderBy(criteriaBuilder.asc(root.get(idPropertyName))); 
+0

謝謝,它的工作原理! –