使用jpa api标准加入不相关的实体

Fil*_*ppo 17 java jpa join associations criteria-api

两个数据库表具有外键关系.

它们通过JPA 映射到两个实体AB,但是连接列是从实体中手动删除的,因此在JPA世界中,类AB不相关,您无法通过字段/属性从一个导航到另一个.

使用标准api是否可以创建一个连接两个表的查询?

我在互联网上找到的所有例子都使用连接列来实现目标,但是,如上所述,它已从代码中删除,因为大多数时候我对AB之间的关系不感兴趣而且我担心可能的开销.

SJu*_*n76 22

第一:外键关系不仅适用于导航.它们主要用于确保在关系中不引入虚假值.它们还可以帮助数据库进行查询优化.我建议你重新考虑一下.

无论如何,要创建使用多个不相关实体的查询,您需要将它们作为from(root)实体(就像在SQL或JPQL中那样)

SELECT .... FROM Link l, Training t WHERE l.attribute = t.attribute;

Root<Link> rootLink = criteriaQuery.from(Link.class);
Root<Training> rootTraining = criteriaQuery.from(Training.class);
...
criteriaQuery.where(
    criteriaBuilder.equal(rootLink.get(link_.linkAttribute), trainingLink));
Run Code Online (Sandbox Code Playgroud)

  • 我不明白这个答案.`trainingLink`来自哪里?我不希望像`criteriaBuilder.equal(rootLink.get(link_.linkAttribute),rootTraining.get(training_.linkAttribute`)(它不适用于条件api)? (8认同)
  • 值得注意的是,使用多个根会在实体之间创建笛卡尔乘积(即“ CROSS JOIN”)。在“ WHERE”条件下,其行为与“ INNER JOIN”相同(包括与[here](/sf/ask/46968631/#671023)所述的相同性能)。 (2认同)

Vla*_*cea 6

从 Hibernate 5.1 开始,您可以在使用 JPQL 和 HQL 时加入不相关的实体:

Tuple postViewCount = entityManager.createQuery(
    "select p as post, count(pv) as page_views " +
    "from Post p " +
    "left join PageView pv on p.slug = pv.slug " +
    "where p.title = :title " +
    "group by p", Tuple.class)
.setParameter("title", "Presentations")
.getSingleResult();
Run Code Online (Sandbox Code Playgroud)

但是,此功能在 Criteria API 中不可用,因为这需要 API 扩展。

解决方案

虽然您可以尝试使用两个Root对象并通过 WHERE 子句谓词模拟 INNER JOIN,但生成的 SQL 并不是解决此问题的最佳方法。

您应该考虑使用jOOQ,因为除了让您能够以任何可能的方式连接表之外,如果您将生成的 SQL 查询传递给 JPAcreateNativeQuery方法,您还可以获取实体。


ant*_*vio 5

最新JPA规范(2.1)不适用于无关实体的加入

但是Hibernate 5.1.0+和EclipseLink 2.4.0+支持临时连接。 http://blog.anthavio.net/2016/03/join-unrelated-entities-in-jpa.html

另一种可能是本地查询 http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html

  • 第一个链接已损坏。您能否提供一个替代链接,或者(更好)给我们一个该链接告诉我们要做什么的摘要? (2认同)