0

我了解在 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

4

2 回答 2

3

我认为没有更干净的方法可以按照标准编写这种查询,而不是使用手写的 JPQL 查询,无论如何,在标准之外有许多查询构建器,例如:query dslTorpedo queryObject Query允许如果有帮助的话,以更简洁的方式编写查询:)

于 2014-02-08T18:03:56.067 回答
1

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

CriteriaBuilder:可以使用 SQL 之类的函数、保留工作、操作、谓词完成的任何语句都是此类的一部分,因此需要使用构建器来创建这些语句并将它们应用于条件查询。

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

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

于 2014-02-08T23:44:36.383 回答