使用hibernate获取更少的列
我有一个包含11列的表,但我需要在我的应用程序中只获取其中的2个,我使用spring / hibernate / DAO组合。 现在我有一个包含所有11个字段的域类,以及映射表中所有11列的映射文件。 我如何使用只获得其中2个而不是全部?
或者:
-
使用投影 – Pro:无需添加 – Con:Not typesafe(结果是行
List
,其中每行是Object[])
:select f.foo, f.bar from FatEntity f
-
在SELECT子句中使用构造函数表达式(指定的类不需要是实体或映射到数据库) – Pro:typesafe解决方案 – Con:更多类,除非您将
FatEntity
重用为持有者,在这种情况下,许多字段将为null
:select new com.acme.FatEntityDetails(f.id, f.foo, f.bar) from FatEntity f
请注意,如果在
SELECT NEW
子句中指定了实体类名,则生成的实体实例处于新状态(无持久标识)。 -
使用映射在同一个表上的另一个实体只包含必填字段 – Pro:这是一个可以修改和更新的真实实体 – Con:更多类。
from LightEntity
#2和#3之间的主要区别是:
-
2根本不要求持有人是实体。
- #2中的持有者可以是映射在另一个表上的实体。
- 如果#2返回实体,它们处于新状态(这可能是一个问题,或者不是)。
尝试:
SELECT myEntity.one, myEntity.two FROM MyEntity myEntity
你甚至可以这样做:
SELECT new MyEntityDescription(myEntity.one, myEntity.two) FROM MyEntity myEntity
获取实体描述列表。
如果您从不需要超过表的这两列,则可以更改hibernate映射以仅将那些需要的列映射到实体类。 仅映射要在应用程序中访问的表列。 请记住,可以违反“忽略”列上的数据库约束,例如非空约束,外键或唯一约束。
- 使用JSF,JPA和DAO。 没有spring?
- Spring Java中许多DAO的策略
- 如何使用DaoAuthenticationProvider以编程方式使用Spring Security对用户进行身份validation
- 使用DAO模式的利弊
- 两个类内部几乎重复的代码
- 为什么即使在Spring服务类的第二种方法中传播= Propagation.REQUIRES_NEW时,事务也会回滚?
- 如何以线程安全的方式在DAO中缓存信息
- 测试DAO时出错:sun.reflect.generics.reflectiveObjects.TypeVariableImpl无法强制转换为java.lang.Class
- Hibernate开启/关闭会话,DAO的正确方法