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