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

8
我正在尝试将我们使用的“TableController”类(不使用ORM)转换为生成动态SQL的方式(实际上是将排序列和方向附加到SQL中)。
将这个“TableController”视为一个类,它具有返回给定类别(在运行时已知)实体列表的函数,按照给定顺序(字符串列/属性名称,布尔值升序/降序,两者都在运行时确定)。
现在的挑战是使用JPA(Hibernate - 但客户要求仅使用JPA接口):如何以类型安全的方式实现此功能而不使用字符串连接?
谢谢!
1个回答

19

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

Pascal - 感谢您的建议。我们使用 JPA 2.0,我已经认为它会引导我们使用 Criteria API。但是,我如何解决我所描述的特定问题呢? - Zeemee
无法更精确地描述问题的实际情况。 - Pascal Thivent
1
抱歉我的回复延迟了 - 想象一种具有三个参数的方法:Class entityClass、String orderByColumn和boolean ascending。我该如何创建一个查询,而不需要使用字符串拼接,来获取给定类中所有对象的正确排序?谢谢! - Zeemee
在这个方法之外创建订单对象怎么样?:D 你知道这是否可能吗?我现在正在使用一个 map,但我没有找到类似的东西。 - bogdan.rusu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接