假设我有一个使用 JPA 列出实体的通用方法
public <T> List<T> list(Class<T> entity) throws Exception {
List<T> result = new ArrayList<T>();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<T> query = builder.createQuery( entity );
Root<T> root = query.from( entity );
query.select( root );
//possible?
query.orderBy(builder.asc(...));
result = em.createQuery( query ).getResultList();
return result;
}
我们还有什么可以补充的吗orderby
到查询并使其按主键排序而不指定主列作为表达式?我的意思是,有没有一个Key
/Constant
或者 JPA 中的某些内容意味着任何实体的主键列,或者检索它的 util 方法?
此信息可通过以下方式获得元模型 http://docs.oracle.com/javaee/6/api/javax/persistence/metamodel/package-summary.html。在单一 id 属性的情况下,以下内容应该有效(未经测试,因此可能会出现一些问题,特别是对于泛型,但一般方法是这样的):
public <T> SingularAttribute<? super T, ?> getIdAttribute(EntityManager em,
Class<T> clazz) {
Metamodel m = em.getMetamodel();
IdentifiableType<T> of = (IdentifiableType<T>) m.managedType(clazz);
return of.getId(of.getIdType().getJavaType());
}
//usage
SingularAttribute idAttribute = getIdAttribute(em, entity);
Path<?> pathToId = root.get(idAttribute);
query.orderBy(builder.asc(pathToId));
当实体使用IdClass http://docs.oracle.com/javaee/6/api/javax/persistence/IdClass.html也应该支持,解决方案有点复杂,但可以使用提供的方法可识别类型 http://docs.oracle.com/javaee/6/api/javax/persistence/metamodel/IdentifiableType.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)