代码之家  ›  专栏  ›  技术社区  ›  Zeemee

生成JPA动态类型查询的最佳实践?

  •  7
  • Zeemee  · 技术社区  · 15 年前

    我正在尝试转换一个“TableController”——我们用来(不带ORM)生成动态SQL的类(实际上order列和方向被附加到SQL中)。

    把这个“TableController”看作是一个类,它有一个函数,可以按给定的顺序返回给定类(运行时已知)的实体列表(字符串列/属性名,布尔asc/desc,两者都在运行时)。

    现在的挑战是,使用JPA(Hibernate-但是客户只需要使用JPA接口):如何在没有字符串连接的情况下,以类型安全的方式实现这一点?

    1 回复  |  直到 15 年前
        1
  •  18
  •   Pascal Thivent    15 年前

    现在的挑战是,使用JPA(Hibernate-但是客户只需要使用JPA接口):如何在没有字符串连接的情况下,以类型安全的方式实现这一点?

    如果您使用的是JPA2.0实现,我认为您应该看看 Criteria API

    如果您使用的是JPA1.0,除了字符串连接之外,没有其他标准方法(我的建议是使用Hibernate的专有 Criteria Queries ).

    下面的文章也可能会给你一些(具体的)想法: Hibernate Querying 102 : Criteria API


    想象一下有三个参数的方法:类entityClass、字符串orderByColumn、布尔升序。如何创建一个没有字符串连接的查询,该查询按正确顺序提供给定类的所有对象?

    public <T> List<T> findAllEntitiesOrderedBy(Class<T> entityClass, String orderByColumn, boolean ascending) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
    
        CriteriaQuery<T> criteria = builder.createQuery(entityClass);
        Root<T> entityRoot = criteria.from(entityClass);
        criteria.select(entityRoot);
        javax.persistence.criteria.Order order = ascending ? builder.asc(entityRoot.get(orderByColumn))
            : builder.desc(entityRoot.get(orderByColumn));
        criteria.orderBy(order);
        return em.createQuery(criteria).getResultList();
    }