当前位置: 首页 > 知识库问答 >
问题:

如何使用JPA标准API连接无关实体

施凡
2023-03-14

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

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

使用JPA标准API,是否可以创建连接两个表的查询?

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

共有3个答案

长孙沈义
2023-03-14

最新的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

韦原
2023-03-14
匿名用户

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

然而,Criteria API中没有此功能,因为这需要API扩展。

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

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

艾焱
2023-03-14

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

无论如何,要创建使用多个不相关实体的查询,需要将它们作为(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));

 类似资料:
  • 此查询用于检索一对多关系中的最后记录(请参阅SQL连接:选择一对多关系中的最后记录) 我的问题是:如何使用jpa criteria api使用subselect构建这个连接?可能吗?如果没有,可以使用jpql吗? 到目前为止我的代码:

  • 我有两个没有建模关系的表: 带有列的表: 带有列的表 两个表之间的关系是多对一(多通信对一个人C): 通用域名格式。代码=人员C。密码 这两个表用注释映射,但我没有声明任何关系。 我试图选择的是按人员排序的表。说明。 我怎样才能做到JPA和Hibernate?

  • 尝试编写一个标准api查询。 应该作为参数传递,并且可以更改。我在代码中添加了实体。 感谢任何帮助或指导。 这就是我目前的情况: 我现在能够获取正确的数据,但列表没有排序。这是我在日志中看到的,生成了两个查询,一个有顺序,另一个没有顺序。

  • 我有两个遗留实体 和由。我有一个CriteriaAPI查询,它返回所有者集合,我需要按。 因为我不能将子查询放到,也不能更改这些实体的JPA映射,所以对我来说似乎并不容易。 请给任何想法。

  • 型号: 我正在尝试使用JPA的条件api根据实现的属性查询实体。例如,查询所有拥有“SOME_NAME”部门项目的用户(该字段在上不存在)。 我发现有一种方法可以通过向下转换查询的项目实体来实现。我正在尝试类似的方法: 例外: org.springframework.dao.InvalidDataAccessApiUsageException:org.hibernate.hql.internal.

  • 问题内容: 尝试使用socket.io- client连接到用Go编写的websocket服务器。我已经使用节点WebSocket库(npm)成功连接。因此,有效的Websocket代码如下所示: 非常简单并且有效-另一端的套接字以设定的频率发送消息。但是我最初尝试使用(npm),但是无法继续使用。它肯定将websocket列为其首选传输,但是该死,如果我能连接它的话: 连接永远不会发生,因此不会