JPA 中 select 数据库中前 N 个实体的常用方法

Common method to select first N entities from database in JPA

我尝试编写一些常用方法 (Java/Spring/JPA) 以从数据库中获取前 N 个实体。所有实体都有 @Id 注释,但 id 字段可以有不同的名称。例如,ID 为 Table.tableIdPlate.plateId 的实体。 tableIdplateId 都有 @Id 注释,但字段名称不同(在代码中和在数据库中)。我无法更改字段名称。我试图通过 JPA Criteria API 对 asc 和 setMaxResults 进行排序,但我找不到按 id 排序的方法。

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();
    }
}

我需要用什么来让 asc 按 id 排序?或者也许还有其他方法可以实现这种方法? JPA 2.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)));