Qui*_*ncy 2 hibernate criteria-api jpa-2.0
假设我有一个使用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;
}
Run Code Online (Sandbox Code Playgroud)
无论如何我们要添加orderby到查询并通过主键进行排序而不指定主列作为表达式?我的意思是,有一个Key/ Constant或东西在JPA意味着任何实体的主键列,或一个实用程序方法来检索它?
此信息可通过元模型获得.如果出现奇异的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));
Run Code Online (Sandbox Code Playgroud)
当还应支持使用IdClass的实体时,解决方案稍微复杂一些,但可以使用IdentifiableType提供的方法.
| 归档时间: |
|
| 查看次数: |
2007 次 |
| 最近记录: |