Spring 数据 JPA 连接 2 个表

Spring Data JPA join 2 tables

我在 MySQL 数据库中有 2 个 table:useruser_additional_details,列如下所述。

用户

用户其他详细信息

Table user_additional_details user table 中的每个用户 ID 包含 0 或 1 行。 但是,数据库没有定义外键约束。理想情况下,user_additional_details 中的列应该作为可空列添加到 user table 中,但由于某些未知原因没有这样做。现在我需要为以下查询定义实体。

select user.userId, user.phone, user_a_d.personalPhone
from user
join user_additional_details as user_a_d
    on user.userId = user_additional_details.userId

我尝试为 table 定义 JPA 实体,但无法弄清楚如何创建使用来自不同 table 的列的实体。

创建 UserEntity(包含来自 User table 的所有列)和 UserAdditionalDetailsEntity(包含来自 user_additional_details table 的所有列)。我假设您知道如何创建 JPA 实体并将它们映射到数据库 table。

我希望您会在 spring 配置文件中创建实体管理器工厂对象。在创建实体管理器对象的帮助下。

一旦创建了 EntutyManager 对象:

Query q= em.createQuery("select user.userId, user.phone, userDetails.personalPhone
from UserEntity user
join UserAdditionalDetailsEntity as userDetails
    on user.userId = userDetails.userId");
List<Object[]> resultList= q.getResultList();

获得resultList 后,您可以遍历对象数组列表并获取数据。 resultList 的每个索引将包含代表一行的对象数组 请记住,查询中提到的字段名称应与 JPA 实体中提到的字段名称相同。

看来 SecondaryTable annotation 就是您要找的东西

Specifies a secondary table for the annotated entity class. Specifying one or more secondary tables indicates that the data for the entity class is stored across multiple tables.

在这里您可以找到有关如何使用它的详细示例 - http://www.thejavageek.com/2014/09/18/jpa-secondarytable-annotation-example/