gpt4 book ai didi

java - 在 Hibernate 5.1 中通过自定义 SQL 查询定义实体

转载 作者:行者123 更新时间:2023-12-02 11:16:18 28 4
gpt4 key购买 nike

我正在使用非规范化的第三方数据库,这意味着我无法更改架构。我正在尝试使用 Hibernate 5.1 将表映射到 JPA 实体

有 2 个简单的表A 和 B:

|  A_ID(pk) |      |  B_ID(pk) |
------------- -------------
| 1 | | 1 |
------------- | 2 |
-------------

表 C 具有复合主键,并且与表 A 具有多对一关系:

|   A_ID(pk&fk)   | QUANTITY(pk) | VALID_FROM(pk) |
---------------------------------------------------
| 1 | 1 | 2017-05-21 |
| 1 | 1 | 2018-01-01 |
| 1 | 2 | 2017-05-21 |

表 D 有一个复合主键:

|   A_ID(pk&fk)   | QUANTITY(pk) | VALID_FROM(pk) |   B_ID(pk&fk)  | 
--------------------------------------------------------------------
| 1 | 1 | 2018-01-21 | 1 |
| 1 | 2 | 2018-01-21 | 1 |
| 1 | 2 | 2018-05-01 | 2 |

VALID_FROM 列不是表之间连接条件的一部分,可以采用任何值。

我正在尝试在表 C 和 D 之间建立关系,但由于 VALID_FORM 主键组件,它们无法使用多对一进行建模。而且由于没有连接表,它们也无法使用多对多进行建模。

最好的解决方案是创建一个类似的 View

CREATE VIEW C_NORM AS
SELECT DISTINCT A_ID, QUANTITY
FROM TABLE_C;

这将产生 View C_NORM:

 |   A_ID(pk&fk)   | QUANTITY(pk) |
----------------------------------
| 1 | 1 |
| 1 | 2 |

在此 View 上创建 C_NORM 实体可能会

  • 与表 C 的一对多关系
  • 以及与表 D 的另一个一对多关系

但我无法更改架构,因此无法创建新 View 。

有没有办法将实体定义为带有注释的类,该类基本上基于 native SQL 查询而不是数据库中的 View 或表?

最佳答案

不,这是不可能的,而且没有意义。

实体用于更新、插入和删除。如果您不想执行任何这些操作,则不应使用实体。

您可以使用@SqlResultSetMapping将 native 查询的结果映射到类

Query q = em.createNativeQuery(
"SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS avgOrder " +
"FROM Customer c " +
"JOIN Orders o ON o.cid = c.id " +
"GROUP BY c.id, c.name",
"CustomerDetailsResult");

@SqlResultSetMapping(name="CustomerDetailsResult",
classes={
@ConstructorResult(targetClass=com.acme.CustomerDetails.class,
columns={
@ColumnResult(name="id"),
@ColumnResult(name="name"),
@ColumnResult(name="orderCount"),
@ColumnResult(name="avgOrder", type=Double.class)})
})

或者使用 QLRM:https://github.com/simasch/qlrm

关于java - 在 Hibernate 5.1 中通过自定义 SQL 查询定义实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50254700/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com