我想在Hibernate表格映射/实体类中添加一个字段。休眠 - 选择/仅加载字段
我想这个字段不被映射到实际的表列,我希望Hibernate不要尝试插入/更新到数据库。
但我希望能够通过DAO中的自定义选择加载此字段,例如通过
query.addEntity(getPersistentClass().getName());
我得到这个最接近的是通过使场@Transient
,
后来甚至选择不加载它的价值。所以这不是我所需要的
。
这是可能的,如果有的话,怎么样?
我想在Hibernate表格映射/实体类中添加一个字段。休眠 - 选择/仅加载字段
我想这个字段不被映射到实际的表列,我希望Hibernate不要尝试插入/更新到数据库。
但我希望能够通过DAO中的自定义选择加载此字段,例如通过
query.addEntity(getPersistentClass().getName());
我得到这个最接近的是通过使场@Transient
,
后来甚至选择不加载它的价值。所以这不是我所需要的
。
这是可能的,如果有的话,怎么样?
好吧,如果我明白你正在尝试做的很好的话,我认为解决的办法是这样
@Column(name =“{列名}”,可更新= FALSE)
这样一旦创建对象,休眠将不会尝试更新此列
我知道这个“可更新”的东西,但我的问题是我没有一个专栏来映射这个字段。所以我不希望它被映射到物理表列。不管怎么说,还是要谢谢你。 –
然后使用瞬态,如果你想从另一个表中得到这个值你可以使用公式 –
我不知道这是可能的。好的,我会在这方面做一些研究,谢谢。 –
您的getter必须更聪明一点。 对于为例,你可以从春天HibernateCallback接口这样的:
public String getName(Session session) {
return new HibernateCallback<String>() {
@Override
public String doInHibernate(Session session) throws HibernateException {
return session.createSQLQuery("SELECT NAME FROM MY_TABLE WHERE SOME_CONDITIONS").uniqueResult();
}
}.doInHibernate(session);
}
一个更好的办法是创建一种在另一个类,你可以访问会话中执行的方法。 使用该解决方案,您仍然可以将您的字段标记为@Transient
。
谢谢,但如果我加载100个实体不会触发100个单独的查询到数据库?如果是这样,我不希望这样。 –
它只会在需要时调用数据库。但是,一天结束的时候,如果你想要检索100个不同的实体的信息,它会去100次到DB。也许你可以考虑使用这种方式来检索所有的实体名称,并且只需往返于数据库一次往返。然后将结果映射到正确的实体。 – perbellinio
是的,这就是我想要了解的,如何通过1往返数据库来完成。 –
您可以使用 @Column(name = “{列名}”,插入=假,可更新= FALSE)
不标记字段作为@Transient。
这种方式这个属性不会被插入或更新,但可用于选择。
AFAIK瞬态是不使用ORM模型映射列的唯一方法。如果一个字段没有映射到数据库,那么Hibernate怎么可能给它分配一个值呢? –
@TimBiegeleisen我的想法是做一个SQL查询,例如'select t。*,1 as disabled from table t'然后所有其他字段来自表格,我说的'Disabled'字段是从查询返回的记录集的'Disabled'列加载的。 –
我不确定我了解你的问题。该领域的价值从何而来?它在数据库中还是某个公式的结果? – Thomas