在JPA中从数据库中选择前N个实体的常用方法

时间:2016-12-26 11:42:48

标签: java spring jpa criteria-api

我尝试编写一些常用方法(Java / Spring / JPA)来从数据库中获取前N个实体。所有实体都有@Id注释,但id字段可以有各种名称。例如,具有ids 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();
    }
}

我需要使用什么来按ID进行asc排序?或者可能有其他方法来实现这种方法? JPA 2.1。

1 个答案:

答案 0 :(得分:1)

For a similar purpose using Hibernate, I get the name of the id property of an entity thru ClassMetadata.getIdentifierPropertyName(). Using JPA, it seems that the same can be achieved thru something like this (i didn't try, just read javadoc):

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