2016-12-26 78 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

谢谢,它的工作原理! –