【问题标题】:How to represent table with nulls in Spring Data JPA?如何在 Spring Data JPA 中用空值表示表?
【发布时间】:2022-01-25 12:48:27
【问题描述】:

我应该如何在 Spring Data Java Persistence Application Programming Interface (JPA) 中表示此表?

该表是特定的,因为它没有主键并且表中的每一列都可以有空值,并且它是只读的

在实体类中,我不能简单地用 @id 注释单个列,因为没有具有唯一值的列。 当然,我可以通过用@id 注释每一列来在实体类中创建复合虚拟主键,这可行,但前提是行中没有nulls。因此,如果我选择所有列都不是null 的行,那么这行得通。但是,如果一个或多个列包含null,Spring 无法从表中提取该行,而是只为整行返回null,而不是返回一个仅包含适当字段null 的实体对象。

请不要说“只在表格中添加 id 列”,因为表格对我们来说是只读的。我的公司谈判了一个多月,只是为了获得桌子的阅读权!我不能简单地在表格中添加id 字段。

在这种情况下我还能做什么?除了手动执行查询并提取结果。我可以以某种方式伪造id 字段以使春天快乐吗? id 字段对我们的应用程序并不重要,我们永远不会通过 id 过滤表,所以就我而言,它可以是任何让 Spring 高兴的东西。

【问题讨论】:

    标签: java sql spring-boot jpa spring-data-jpa


    【解决方案1】:

    我认为没有办法做到这一点。

    只需注入 NamedParameterJdbcTemplate 并查询即可。

    JPA 的中心前提是您可以从一堆表中加载数据,编辑生成的对象结构,JPA 将记录并镜像数据库中数据的更改。 如果您没有任何东西可用作 id,您将不知道要更新哪一行。所以这整个方法有点行不通。

    【讨论】:

    • 为什么@Embeddable@Transient 不起作用?
    • @RandyCasburn 不知道你会怎么做。
    • 我想我在想使用和@Embeddable 类来构造静态或@Transient 的UUID 可以用来满足JPA 的ID 要求。 (@EmbeddedId)
    【解决方案2】:

    您可以将@EmeddedId 与您创建的ID 一起使用。将 ID 字段设置为@Transientstatic,这样就不会影响持久性。

    在下面的示例中,我使用 UUID 静态方法 .randomUUID() 来生成 ID。

    所以把它放到你的@Entity 中,不管nulls,你都会得到每一行。插入也可以正常工作(取决于您如何消除行的歧义)。

        @EmbeddedId
        static UUID uuid = UUID.randomUUID();
    

    【讨论】:

    • 我无法让您的解决方案发挥作用。如果我只将您的代码放在我的实体类中,我会收到 No identifier specified for entity 错误。如果我用@Id 注释其他字段,当我用@Id 注释的列包含null 时,我仍然得到null 而不是实体对象。你有别的想法吗?
    • 当我测试这个时,我使用的是 JDBCTemplate 和 BeanPropertyRowMapper,它就像一个魅力。听起来您的表可能比一组简单的可空列更复杂。您的实体类可以发布吗?
    • @KRISTIJANTOMASINI - 我没有使用休眠。那是一个休眠错误。如果将@Id@EmbeddedId 一起包含会发生什么?
    猜你喜欢
    • 2019-02-15
    • 2019-02-16
    • 2017-11-08
    • 2021-06-27
    • 2018-08-08
    • 2022-07-21
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多