繁体   English   中英

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

[英]Best practice to generate a JPA dynamic, typed query?

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

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

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

谢谢!

现在的挑战是,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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM