JPA标准构建器 - 以人类可读的语言

时间:2014-01-24 14:26:41

标签: jpa criteria builder human-readable

我理解在Java持久性查询语言之上使用JPA条件构建器的优点。

有没有简单的方法来解释如何构建此类查询? 我需要一个更人性化的解释来构建我的查询,这需要一种 直观的方法来查询我的数据库

示例:

SQL:

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

带有MetaModel的Critera Builder:

Map<SingularAttribute<Transaction, ?>, Object> params = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();           
CriteriaQuery<Tuple> cq = cb.createTupleQuery();     
Root<Transaction> r = cq.from(Transaction.class);

Predicate p= cb.conjunction();
for (Map.Entry<SingularAttribute<Transaction, ?>, 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<Tuple> result = em.createQuery(cq).getResultList();

此示例基于另一个问题: Complex queries with JPA criteria builder

2 个答案:

答案 0 :(得分:3)

我不认为有更简洁的方法来编写遵循标准的那种查询而不使用手写的JPQL查询,无论如何,标准之外的许多查询构建器如:query dsl或{允许以更干净的方式编写查询的{3}}或Torpedo query,如果可以帮助:)

答案 1 :(得分:0)

Criteria查询具有JPQL的一些优点,例如:类型安全性,基于Java编程模型编写SQL查询并使其可移植。当我开始使用JPA时,我理解这一点的最简单方法是考虑您需要使用的主要对象及其功能。

CriteriaBuilder:任何可以使用SQL完成的语句,如函数,保留的作品,操作,谓词都是此类的一部分,因此需要使用构建器来创建它们并将它们应用于criteriaQuery

CriteriaQuery :任何以创建正式SQL语句为目标的语句都在这里,将其视为查询定义的样板,它具有from,select,where,group by和all语句,所以这是查询本身,必须用来确定你真正从数据库中寻找什么。

现在想做一个查询,你总是必须使用 Root ,这意味着在你的查询定义中选择你的主表,基于此并帮助你从CriteriaQuery和CriteriaBuilder对象将搜索重新定义为您想要的任何内容。