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

Zee*_*mee 7 java hibernate jpa jpa-2.0

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

可以将这个'TableController'看作一个类,它具有一个函数,用于以给定的顺序返回给定类的实体列表(在运行时已知)(字符串列/属性名称,布尔值asc/desc,两者都在运行时).

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

谢谢!

Pas*_*ent 18

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

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

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

以下文章也可能会给你一些(具体的)想法:Hibernate查询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();
}
Run Code Online (Sandbox Code Playgroud)