【问题标题】:JPA 2 criteria query, where on property list classJPA 2 条件查询,在属性列表类的位置
【发布时间】:2020-02-12 14:51:22
【问题描述】:

我想使用标准类型的查询来实现下面的查询:

SELECT
    a.*
FROM
    table_a a
    INNER JOIN table_b b ON a.id= b.id
WHERE
    b.url = 'value.org';

条件查询:

    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<A> criteriaQuery = criteriaBuilder.createQuery(A.class);
    final Root<A> root = criteriaQuery.from(A.class);
    root.fetch(A.domains); // domains is a List<B>
    criteriaQuery
            .select(root);

实体 A:

  @OneToMany
  List<B> domains;

实体 B:

  @Column(name="URL")
  String url;

我的问题是如何在哪里重现,我尝试过类似的方法:

 .where(criteriaBuilder.equal(root.get(A.domains).. ??))

但是我不知道怎么继续,因为proposal 子句是as(), in(..) 等等。

有什么提示吗?

【问题讨论】:

标签: hibernate jpa-2.0 criteria-api


【解决方案1】:

首先,您不需要获取,因为您只想获取一个。 其次,你几乎很好,唯一重要的缺失部分是join。 以下是适合您的代码:

public A loadAForValueOrg() {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<A> query = builder.createQuery(A.class);
    Root<A> a = query.from(A.class);
    Join<A, B> b = a.join("domains");
    query.select(A);
    query.where(builder.equal(b.get("url"), "'value.org'"));
    TypedQuery<A> typedQuery = entityManager.createQuery(query);
    typedQuery.setMaxResults(1);
    List<A> result = typedQuery.getResultList();
    return result.isEmpty() ? null : result.get(0);
}

几个注意事项:

  • setMaxResults 不是必需的,只有良好的性能实践
  • 如果没有结果,我们将返回 null,因此它是 Java 8 的良好候选者 Optional
  • 另外我建议使用metamodel 不操作字符串(容易出错)

【讨论】:

  • 关于 Java8 可选,对于 JPA 2.2,您还可以使用 .getResultStream()。所以代码是 entityManager.createQuery(criteriaQuery) .getResultStream() .findAny() .orElse(null);
猜你喜欢
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2011-10-17
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多