【问题标题】:Spring Data JPA join 2 tablesSpring Data JPA 连接 2 个表
【发布时间】:2018-11-30 07:09:19
【问题描述】:

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

用户

  • id(自动递增)
  • userId(唯一)
  • 名字
  • 姓氏
  • 电话
  • 电子邮件

用户其他详细信息

  • id(自动递增)
  • userId(与 User 中的 userId 匹配)
  • 个人电话
  • 个人邮箱

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

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

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

【问题讨论】:

  • 为什么不能使用 JPQL 来获取 Object 数组中需要的数据?
  • @GarimaGupta 我是 JPA 的新手。你能举个例子吗?

标签: java mysql jpa spring-data-jpa persistence


【解决方案1】:

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

为带注释的实体类指定一个辅助表。指定 一个或多个辅助表表明实体的数据 类存储在多个表中。

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

【讨论】:

  • 我喜欢这种方法!我在发布问题几个小时后发现了它:)。
  • 对我来说效果很好。谢谢!
【解决方案2】:

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

我希望你会在你的 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 实体中提及的字段名称相同。

【讨论】:

  • 感谢@garima-gupta 的建议。
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 2017-11-08
  • 2013-11-27
  • 2018-11-17
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多