【问题标题】:Mapping Hibernate value from another table for presentation only从另一个表映射 Hibernate 值仅用于演示
【发布时间】:2014-01-09 21:50:33
【问题描述】:

我无法通过搜索找到这个确切的场景......

我有一个场景,我有 2 个实体。

第一个存储一些基本信息:

表:TABLE_A ID、AccountId、FirstName、LastName

现在,我将帐户 ID 存储在表中,但我只想获取帐户名称 无需在第一个类中添加 Account 实体... hibernate 是否能够从 Account 表中查找一个值并将其存储在 TABLE_A 类中的(例如)String accountName 字段中?这只是为了显示一列......或者是将实体添加到此类并加载它的理想方式?

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    你可以有类似的东西:

    private String accountName;
    
    @Formula("(select acc.account_name from tb_account acc where acc.id = account_id)")
    public String getAccountName() {
        return accountName;
    }
    
    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }
    

    在您的主实体中,现在您不需要映射关联,并且 Hibernate 每次获取主实体的实例时都会获取 account_name

    顺便说一句,Hibernate 在你的 select 子句中使用嵌套查询来获取 accountName,因此对 accountName 进行过滤和排序不会很好地执行,有什么好的理由不使用简单的关联?

    【讨论】:

      【解决方案2】:

      我强烈建议您创建 Account 实体,即使是一个非常简单的带有帐户 ID 和帐户名称的实体。

      但是,如果您坚持不这样做,您可以采取一些替代方案。

      1. "More Complex Associate Mapping" 中所述,您可以使用子选择来获取帐户名称

      2. 您可以考虑在 DB 中创建一个包含该额外列的视图,而不是映射到实际表。这应该会让你在 Hibernate 中的生活更轻松

      3. 如果它仅用于显示而不是作为实体的一部分(这意味着该帐户名不打算成为域逻辑的一部分),我建议您将您的关注点分开与您的域模型设计进行演示。与 Account 建立适当的关联,并考虑执行 select new FooDisplayInfo(foo, foo.account.name) from Foo foo where blablabla

      4. 之类的操作

      【讨论】:

        【解决方案3】:

        您可以在表示 TABLE_A 表的实体中创建与 Account 表的关联,并通过如下查询获取帐户名称:

        SELECT a.account.name FROM TableA a WHERE...
        

        这将只获取帐户名称,而不是整个帐户行。

        【讨论】:

          猜你喜欢
          • 2013-04-10
          • 1970-01-01
          • 2015-04-03
          • 2012-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多