【问题标题】:How to add property counted in DB to @Entity class?如何将数据库中计数的属性添加到@Entity 类?
【发布时间】:2011-06-25 16:22:05
【问题描述】:

我有一个实体。有时我需要这个对象也包含一些值,称之为'深度'。查询可能类似于'select b.id, b.name, b..., count(c.id) as depth from Entity b, CEntity c where ...'。所以我创建了扩展实体的类 NonHibernateEntity。然后上面编写的查询结果完美地存储为 NonHibEntity 列表,其中包含 Entity 的所有字段(随着它们的扩展)和属性“深度”。我通过设置 aliasToBean 结果转换器来做到这一点:.setResultTransformer(Transformers.aliasToBean(NHEntity.class)). 但是,指定所有所需字段的所有别名既烦人又不方便。 然后,如果我想将此对象之一保存到 DB - session.saveOrUpdate((Enity)nHibEntity) - 有一个关于 nHibEntity 不是 Hibernate Entity 的例外。

我听说将“实体”作为字段存储在 NonHibEntity 中(聚合,而不是继承)。但这似乎也很不方便。 你怎么看?什么是合适的解决方案?

【问题讨论】:

    标签: java oop hibernate hql hibernate-mapping


    【解决方案1】:

    Formula 列映射可能适合您的需要。我会先试试这个。

    如果这会导致您担心的性能问题,您可以尝试仅在子级中使用此字段的映射类层次结构,并将两者映射到同一个表。不确定这是否真的有效......

    作为最后的手段,使用非映射类做你现在所拥有的,但将实体作为另一个类中的一个字段 - 正如你所说的聚合而不是继承,并确保有一种检索方法未映射实体中的映射实体,以便您保存。将其设为Decorator 是明智的,这样它既是子类又是聚合,您可以继续忽略大部分代码中的区别。

    但是,对于未映射的子类和/或聚合,您必须拉出实体才能保存。

    【讨论】:

    • 但每次我从 db 获取对象时都会计算此列。我只是有时需要这个专栏。每次都计算可能会影响性能。
    【解决方案2】:

    如果有人想知道 - 我以这种方式解决了这个问题:

    只是将这个计算字段设为@Transient,然后

    List<BaseEntry> result = new ArrayList<BaseEntry>();
        Iterator it =  session()
        .createQuery("select b, (select count(p.id) as depth from BaseEntry p " +
                "   where ... ) as d" +
                " from BaseEntry b " +
                " where ... ")
        .list().iterator();
        while ( it.hasNext() ) {
            Object[] row = (Object[]) it.next();
            BaseEntry entry = (BaseEntry) row[0];
            Long d = (Long) row[1];
            entry.setD(d);
            result.add(entry);
        }
        return result;
    

    效果不错,看来以后可以轻松支持了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 2013-07-18
      相关资源
      最近更新 更多