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



我了解在Java持久性查询语言上方使用JPA标准构建器的优点。

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

示例:

sql:

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

critera builder with metamodel:

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();

这个示例是基于另一个问题:使用JPA标准构建器的复杂查询

我认为,按照标准编写此类查询的方式没有更干净的方法,而不是使用手写JPQL查询:查询DSL或鱼雷查询或对象查询,如果可以帮助您以更干净的方式编写查询:)

标准查询具有JPQL的一些优点,例如:键入安全性,基于Java编程模型编写SQL Querias并使其可移植。当我开始与JPA一起工作时,我理解这一点的最简单方法是在您需要使用的主要对象中及其功能。

criteriabuilder:使用SQL类似功能,保留作品,操作,谓词的任何语句是此类的一部分,因此需要使用构建器来创建它们并将其应用于Criteriaquery。

criteriaquery :在这里,任何要有作为创建正式SQL语句的目标的语句都在这里,将其视为查询定义的样板,它具有,选择,选择,where,where,comp by and and and and and and and语句,因此这是查询本身,必须用来确定您在数据库中真正寻找的内容。

现在考虑要进行查询,您必须始终使用 root ,这是指根据查询定义中的主表,并根据标准和Criteriabuilder对象提供帮助,您可以可以将搜索重新定义为您想要的任何东西。

最新更新