首页 > 解决方案 > Spring Hibernate查询与非主键的一对一关系

问题描述

我正在使用 Hibernate 在 Spring 上开发 Web 应用程序。

该 Web 应用程序基本上是一个在线商业网站,其中包含特定类别下的许多产品。

该应用程序支持产品的多种语言和单个产品图像的不同尺寸的图片,以便根据不同的用户设备进行优化。因此,用户可以根据自己的设备类型(如移动设备、iPad、台式机)选择他们希望以哪种语言查看产品描述,并获得不同尺寸的产品图像。

所以,我现在有六张桌子,如下所示。

在此处输入图像描述

产品表包含如图所示的产品

在此处输入图像描述

product_info 表包含英语、西班牙语和韩语等产品的不同语言的相同描述,如下图所示。

在此处输入图像描述

product_image 包含产品同一图片的不同尺寸图像的相对路径,如下图所示。

在此处输入图像描述

假设用户请求 category_id = 1(家具)、support_language_id = 1(英语)和 device_type_id = 1(移动设备)下的产品列表。然后,我想查询类似以下的内容,但在 HQL 中。

Select * from product pr
left join product_info pf
on p.id = pf.product_id
left join product_image pi
on p.id = pi.product_id
where category_id = category_id of user choice
and support_language_id = support_language_id of user choice
and device_type_id = device_type_id of user device

当我执行这个 HQL 查询时,我希望根据用户选择的 category_id、support_language_id 和 device_type_id 获得一个产品对象列表,其中每个产品对象只有一个 product_info 对象和一个 product_image 对象。

按照上面的例子,我会得到一个 id = 1 的产品对象,因为只有一个 category_id = 1 的对象。然后,产品对象将有 id = 1 的 product_info 对象和 id = 1 的 product_image 对象。

如何使用 Hibernate 将这种关系实现到 JPA 中?

我已经尝试过这种方法,但最终会出现错误,例如与非主键或其他键绑定。所以我想知道我的数据库设计是否首先存在结构问题。

你们能否为我提供一个完整的工作代码示例,其中包含所有这些 JPA 注释,例如 @JoinColumn、@OneToMany、@OneToOne 等等,好吗?

只要我能得到想要的结果,您就可以更改、添加和删除列或表。

标签: javamysqlspringhibernatejpa

解决方案


这里是一个不使用注解,只使用hql的解决方案,不知道会不会让你满意。

select p from Product p,ProductInfo pf,ProductImage pi where p.id = pf.productId and p.id = pi.productId and...

推荐阅读