【发布时间】:2011-02-03 09:00:57
【问题描述】:
我有一个包含 11 列的表,但我只需要在我的应用程序中获取其中的 2 个,我使用的是 spring/hibernate/DAO 组合。现在我有一个包含所有 11 个字段的域类,以及映射表中所有 11 列的映射文件。我如何使用 get just 2 of them not all?
【问题讨论】:
标签: java hibernate spring orm dao
我有一个包含 11 列的表,但我只需要在我的应用程序中获取其中的 2 个,我使用的是 spring/hibernate/DAO 组合。现在我有一个包含所有 11 个字段的域类,以及映射表中所有 11 列的映射文件。我如何使用 get just 2 of them not all?
【问题讨论】:
标签: java hibernate spring orm dao
要么:
使用投影 - 优点:无需添加 - 缺点:非类型安全(结果是 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 的主要区别是:
【讨论】:
@OneToOne(fetch = FetchType.LAZY) 连接。然后,如果您确实想加载该列,只需在查询中添加 join fetch:stackoverflow.com/a/48646991/344029
试试:
SELECT myEntity.one, myEntity.two FROM MyEntity myEntity
你甚至可以这样做:
SELECT new MyEntityDescription(myEntity.one, myEntity.two) FROM MyEntity myEntity
获取实体描述列表。
【讨论】:
如果您永远不需要超过表的这 2 列,您可以更改休眠映射以仅将所需的 2 列映射到实体类。仅映射您要在应用程序中访问的那些表列。请记住,“忽略”列上的数据库约束可能会被违反,例如非空约束、外键或唯一约束。
【讨论】: