使用休眠获得更少的列

Posted

技术标签:

【中文标题】使用休眠获得更少的列【英文标题】:Getting fewer columns with hibernate 【发布时间】:2011-02-03 09:00:57 【问题描述】:

我有一个包含 11 列的表,但我只需要在我的应用程序中获取其中的 2 个,我使用的是 spring/hibernate/DAO 组合。现在我有一个包含所有 11 个字段的域类,以及映射表中所有 11 列的映射文件。我如何使用 get just 2 of them not all?

【问题讨论】:

【参考方案1】:

要么:

    使用投影 - 优点:无需添加 - 缺点:非类型安全(结果是 List 的行,其中每行是 Object[])

     select f.foo, f.bar from FatEntity f
    

    在 SELECT 子句中使用构造函数表达式(指定的类不需要是实体或映射到数据库) - Pro:类型安全解决方案 - Con:更多类,除非您在中重用 FatEntity 作为持有者在这种情况下,许多字段将是 null:

     select new com.acme.FatEntityDetails(f.id, f.foo, f.bar) from FatEntity f
    

    请注意,如果在 SELECT NEW 子句中指定了实体类名称,则生成的实体实例处于 new 状态(无持久标识)。

    使用映射在同一张表上的另一个实体,只有必填字段 - 优点:这是一个可以修改和更新的真实实体 - 缺点:更多类。

     from LightEntity
    

#2 和#3 的主要区别是:

2 根本不要求持有人是实体。

#2 中的持有者可能是映射到另一个表上的实体。 如果 #2 返回实体,它们处于新状态(这可能是一个问题,也可能不是)。

【讨论】:

@Pascal Thivent 我不能只在我的域类和映射文件中保留 2 个字段吗? @Gandalf 好吧,我以为有人在使用其他字段。如果这不是真的,那么您确实可以更改您当前的实体。 感谢您提供多种解决方案和解释,您是如何想到的?经验?看书,培训?我会接受你的回答。如果您能指出正确的方向,那就太好了,例如:网站、示例、书籍。 @Gandalf 主要是经验(我从 2003 年开始使用 Hibernate,这很有帮助)和阅读文档、书籍、规范。在这种特殊情况下,我会推荐“Hibernate in Action”和 Hibernate 文档。 JPA 规范 (jcp.org/en/jsr/detail?id=317) 也是一本不错的读物。 @GandalfStormCrow 还有第四个选项:将列移动到单独的表并与@OneToOne(fetch = FetchType.LAZY) 连接。然后,如果您确实想加载该列,只需在查询中添加 join fetch:***.com/a/48646991/344029【参考方案2】:

试试:

SELECT myEntity.one, myEntity.two FROM MyEntity myEntity

你甚至可以这样做:

SELECT new MyEntityDescription(myEntity.one, myEntity.two) FROM MyEntity myEntity

获取实体描述列表。

【讨论】:

【参考方案3】:

如果您永远不需要超过表的这 2 列,您可以更改休眠映射以仅将所需的 2 列映射到实体类。仅映射您要在应用程序中访问的那些表列。请记住,“忽略”列上的数据库约束可能会被违反,例如非空约束、外键或唯一约束。

【讨论】:

我还需要在域类中有 2 个字段吗?

以上是关于使用休眠获得更少的列的主要内容,如果未能解决你的问题,请参考以下文章

使用休眠仅从对象中的表中获取选定的列

使用 Postgresql 休眠未正确加载具有“文本”数据类型的列的数据

什么 Postgres 类型将映射到休眠中 Float 类型的列?

休眠:外键的列数错误

在休眠 ORM 中使用一个强制外键和一个可选外键中的列

如果存在不作为实体属性存在的列,休眠会崩溃吗?