【问题标题】:Retrieve primary key column definition of a generic entity in JPA在 JPA 中检索通用实体的主键列定义
【发布时间】:2013-06-04 03:10:49
【问题描述】:

假设我有一个使用 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 或其他东西,意思是任何实体的主键列,或检索它的实用方法?

【问题讨论】:

    标签: hibernate jpa-2.0 criteria-api


    【解决方案1】:

    此信息可通过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 提供的方法。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 2017-12-11
      相关资源
      最近更新 更多