JPA 2标准查询,在属性列表类上,其中

问题描述 投票:0回答:1

我想使用条件类型的查询来实现以下查询:

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 hibernate-criteria criteria-api
1个回答
0
投票

首先,您不需要获取,因为您只想获取a。其次,您几乎不错,唯一重要的缺失部分是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不要对字符串进行操作(容易出错)
© www.soinside.com 2019 - 2024. All rights reserved.