使用JPA Criteria构建器进行复杂查询

有人可以建议我如何使用JPA Criteria构建器API构建以下查询吗?

SELECT id,status,created_at from transactions where status='1' and currency='USD' and appId='123' order by id 

如果我能找到一个基于使用元模型类或任何其他方式作为Map给出的参数动态创建的解决方案,那就更好了。

它就像这样(没有元模型):

 Map params = ...; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createTupleQuery(); Root r = cq.from(Transaction.class); Predicate p= cb.conjunction(); for (Map.Entry param: params.entrySet()) p = cb.and(p, cb.equal(r.get(param.getKey()), param.getValue())); cq.multiselect(r.get("id"), r.get("status"), r.get("created_at")) .where(p) .orderBy(cb.asc(r.get("id"))); List result = em.createQuery(cq).getResultList(); 

或者使用元模型(类型安全,但有点罗嗦):

 Map, Object> params = ...; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createTupleQuery(); Root r = cq.from(Transaction.class); Predicate p= cb.conjunction(); for (Map.Entry, Object> param: params.entrySet()) p = cb.and(p, cb.equal(r.get(param.getKey()), param.getValue())); cq.multiselect(r.get(Transaction_.id), r.get(Transaction_.status), r.get(Transaction_.created_at)) .where(p) .orderBy(cb.asc(r.get(Transaction_.id))); List result = em.createQuery(cq).getResultList();