[英]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.