2016-09-27 69 views
0

我想在Hibernate表格映射/实体类中添加一个字段。休眠 - 选择/仅加载字段

我想这个字段不被映射到实际的表列,我希望Hibernate不要尝试插入/更新到数据库。

但我希望能够通过DAO中的自定义选择加载此字段,例如通过

query.addEntity(getPersistentClass().getName());

我得到这个最接近的是通过使场@Transient
后来甚至选择不加载它的价值。所以这不是我所需要的

这是可能的,如果有的话,怎么样?

+0

AFAIK瞬态是不使用ORM模型映射列的唯一方法。如果一个字段没有映射到数据库,那么Hibernate怎么可能给它分配一个值呢? –

+0

@TimBiegeleisen我的想法是做一个SQL查询,例如'select t。*,1 as disabled from table t'然后所有其他字段来自表格,我说的'Disabled'字段是从查询返回的记录集的'Disabled'列加载的。 –

+0

我不确定我了解你的问题。该领域的价值从何而来?它在数据库中还是某个公式的结果? – Thomas

回答

1

好吧,如果我明白你正在尝试做的很好的话,我认为解决的办法是这样

@Column(name =“{列名}”,可更新= FALSE)

这样一旦创建对象,休眠将不会尝试更新此列

+0

我知道这个“可更新”的东西,但我的问题是我没有一个专栏来映射这个字段。所以我不希望它被映射到物理表列。不管怎么说,还是要谢谢你。 –

+1

然后使用瞬态,如果你想从另一个表中得到这个值你可以使用公式 –

+0

我不知道这是可能的。好的,我会在这方面做一些研究,谢谢。 –

1

您的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

+0

谢谢,但如果我加载100个实体不会触发100个单独的查询到数据库?如果是这样,我不希望这样。 –

+0

它只会在需要时调用数据库。但是,一天结束的时候,如果你想要检索100个不同的实体的信息,它会去100次到DB。也许你可以考虑使用这种方式来检索所有的实体名称,并且只需往返于数据库一次往返。然后将结果映射到正确的实体。 – perbellinio

+0

是的,这就是我想要了解的,如何通过1往返数据库来完成。 –

0

您可以使用 @Column(name = “{列名}”,插入=假,可更新= FALSE)

不标记字段作为@Transient。

这种方式这个属性不会被插入或更新,但可用于选择。