【问题标题】:JPA findAll() not returning everything in a viewJPA findAll() 不返回视图中的所有内容
【发布时间】:2016-07-22 11:32:43
【问题描述】:

我们从一系列选择语句创建一个视图

SELECT d.DLVRB_CD AS ID,
    'DL_GROUP' AS GRP,
    d.DLVRB_NM AS VALU,
    NULL AS DFLT_VALU,
    NULL AS DN
FROM DLVRB d

UNION ALL

SELECT m.MODF_CD AS ID,
    'MD_SELECTION' AS GRP, 
    m.MODF_NM AS VALU,
    NULL AS DFLT_VALU,
    m.MODF_DN AS DN
FROM MODF m

UNION ALL

SELECT m.MODF_CD AS ID,
    'MD_ALL' AS GRP, 
    m.MODF_NM AS VALU,
    NULL AS DFLT_VALU,
    m.MODF_DN AS DN
FROM MODF m

UNION ALL

SELECT v.VAR_CD AS ID, 
    'VA_GROUP' AS GRP, 
    v.VAR_NM AS VALU,
    v.VAR_DFLT_QT AS DFLT_VALU,
    NULL AS DN
FROM VAR v

稍后当我们尝试使用 JPA findAll() 方法返回视图的内容时。它缺少一些数据。特别是它缺少 MD_ALL 组(这是代码中的第三条语句)

视图生成正确,因为每个选择语句的数据都正确显示。只有在调用 findAll() 时,'MD_ALL' 的 select 数据才会丢失。

有趣的是,如果我交换 MD_SELECTION 和 MD_ALL 语句,MD_ALL 将在 findAll() 调用中返回,而不是 MD_SELECTION。

findAll() 在某些情况下会忽略数据吗?

【问题讨论】:

  • 实体是如何定义的?它的 ID 是什么?您确定视图中的每一行都有不同的 ID?
  • ID 不明显。就像在 MD_Selection 和 MD_ALL 的 ID 中一样。 findAll() 会只返回不同的值吗?
  • 那你就有答案了。实体由其 ID 标识。所以同一类型的两个不同实体可能没有相同的 ID
  • 因此,即使从上述语句中正确创建了 DB 视图,即所有 4 个选择语句的所有值都出现在视图中。 findAll() 只会返回指定子集?
  • 是的,您刚刚验证了它,不是吗?身份证必须是身份证。如果它不能识别实体,它就不再是 ID。

标签: mysql hibernate jpa


【解决方案1】:

用户 JB Nizet,是正确的。

尽管视图已正确创建并包含所有表中包含的所有信息,但 JPA 的 Find all 将仅返回不同的实体列表。

在我的情况下,一些 ID(尽管在自己的表中是唯一的)一旦在视图和 JPA 中正确和正确地组合,当从视图中获取实体列表时,它将忽略它找到的任何后续实体读取结果集时出现重复 ID。

在我的情况下,解决方法是在视图中创建自己的唯一 ID 字段。 findAll() 然后检索所有内容,因为它没有任何具有重复 ID 的实体

【讨论】:

    【解决方案2】:

    我认为 JPA 中 findAll() 方法不返回数据的问题可能是因为数据库中存在 1-M 映射。

    【讨论】:

    • 您好,感谢您的回答,我自己添加了答案,我一直没有时间添加一个。
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多