【问题标题】:How to SELECT partial entity, and then use the entity update the entity in the database?如何选择部分实体,然后使用实体更新数据库中的实体?
【发布时间】:2020-01-20 03:33:40
【问题描述】:

我有一个包含大约 70 列的实体类。该表可能有大约 200,000 行。我只想更新所有 200,000 条记录中的一列。

通常我会检索所有实体,并且对于每个实体,使用字段的新值更新实体并保存它。

HQL 看起来像这样:select p from Person p。这允许我们编写 Java 代码,例如:entity.PhoneNumber = new_value; session.flush();。问题是 SELECT 将检索所有 70 列,而只需要 2 列(主键和要更改的字段)。

我们可以这样编写 HQL:select p.Id, p.PhoneNumber from Person p。不幸的是,现在我们不再获取实体,所以现在我们不再以面向对象的方式编程,而是坚持编写 HQL:update Person set p.PhoneNumber = ? where Id = ?

有没有办法加载 PARTIAL 实体(加载一个只填充部分字段的实体,然后使用该对象进行更改然后保存?

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    根据this

    1) 对于您问题的第一部分,答案是肯定的。你可以像下面这样声明一个实体构造函数

    @Entity
    public class Person
    {
       public Person(){} // The jpa required default constructor
    
       public Person(Long id, String phone){
          this.id = id;
          this.phoneNumber = phone;
       }
       ...
    }
    

    然后按如下方式使用:

    select new com.entity.Person(p.Id, p.PhoneNumber)
    from Person p
    

    2) 但是根据同一个链接:

    投影类在实体查询中必须是完全限定的,并且它必须定义一个匹配的构造函数。这里的类不需要映射。它可以是 DTO 类。 如果它确实代表一个实体,则结果实例以 NEW 状态返回(非托管!)。

    更新此实体实例后,您不能期望与数据库同步。所以,对你问题的第二部分的回答是否定的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多