生成JPA动态类型查询的最佳做法?

时间:2010-10-29 08:10:57

标签: java hibernate jpa jpa-2.0

我正在尝试转换我们使用的“TableController”类(没有ORM)来生成动态SQL(实际上,顺序列和方向附加到SQL)。

将此“TableController”视为一个类,它具有以给定顺序(String列/属性名称,布尔值asc / desc,两者都在运行时)。

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

谢谢!

1 个答案:

答案 0 :(得分:18)

  

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

如果您正在使用JPA 2.0实现,我认为您应该查看Criteria API来构建动态查询。

如果你正在使用JPA 1.0,除了字符串连接之外没有标准的方法(我的建议是使用Hibernate的专有Criteria Queries)。

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


  

想象一个有三个参数的方法:Class entityClass,String orderByColumn,boolean ascending。如何在没有字符串连接的情况下创建一个查询,以正确的顺序为我提供给定类的所有对象?

使用JPA 2.0中的Criteria API,您可以执行以下操作:

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();
}