检索JPA中通用实体的主键列定义

时间:2013-06-04 03:10:50

标签: hibernate jpa-2.0 criteria-api

假设我有一个使用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并按主键排序,而不指定主列作为表达式?我的意思是,JPA中是否有Key / Constant或其他东西意味着任何实体的主键列,还是检索它的util方法?

1 个答案:

答案 0 :(得分:9)

此信息可通过metamodel获取。如果出现奇异的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的实体时,解决方案有点复杂,但可能使用IdentifiableType提供的方法。