Java 休眠-仅选择/加载字段

Java 休眠-仅选择/加载字段,java,hibernate,Java,Hibernate,我想在Hibernate表映射/实体类中添加一个字段 我不希望此字段映射到实际的表列,也不希望Hibernate尝试将其插入/更新到DB 但我希望能够通过DAO中的自定义选择加载此字段,例如通过 query.addEntity(getPersistentClass().getName()) 我最接近这一点的方法是将字段@Transient, 但是,即使是select也不会加载其值。所以这不是 这正是我需要的 这可能吗?如果可能的话,怎么可能呢?如果我了解你想要做好的事情,那么我认为解决方案是这样

我想在Hibernate表映射/实体类中添加一个字段

我不希望此字段映射到实际的表列,也不希望Hibernate尝试将其插入/更新到DB

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

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

我最接近这一点的方法是将字段
@Transient

但是,即使是select也不会加载其值。所以这不是
这正是我需要的


这可能吗?如果可能的话,怎么可能呢?

如果我了解你想要做好的事情,那么我认为解决方案是这样的

@列(name=“{name of Column}”,updateable=false)


通过这种方式,一旦对象创建,hibernate将不会尝试更新此列。如果我理解您想要做的事情,那么我认为解决方案如下

@列(name=“{name of Column}”,updateable=false)


这样,一旦创建了对象,hibernate就不会尝试更新此列了

您的getter必须更智能一些。 例如,您可以从spring使用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);
}
公共字符串getName(会话){
返回新的HibernateCallback(){
@凌驾
公共字符串doInHibernate(会话会话)引发HibernateeException{
return session.createSQLQuery(“在某些条件下从MY_表中选择名称”).uniqueResult();
}
}doInHibernate先生(会议);
}
更好的方法是在另一个类中创建一种execute方法,您可以在该类中访问会话。
使用该解决方案,您仍然可以将字段标记为
@Transient

您的getter必须更聪明一些。 例如,您可以从spring使用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);
}
公共字符串getName(会话){
返回新的HibernateCallback(){
@凌驾
公共字符串doInHibernate(会话会话)引发HibernateeException{
return session.createSQLQuery(“在某些条件下从MY_表中选择名称”).uniqueResult();
}
}doInHibernate先生(会议);
}
更好的方法是在另一个类中创建一种execute方法,您可以在该类中访问会话。 使用该解决方案,您仍然可以将字段标记为您可以使用的
@Transient

@列(name=“{name of Column}”,insertable=false,updateable=false)

不要将字段标记为@Transient

这样,此属性将不会被插入或更新,但可以在选择中使用。

您可以使用 @列(name=“{name of Column}”,insertable=false,updateable=false)

不要将字段标记为@Transient



这样,此属性将不会被插入或更新,但可以在选择中使用。

AFAIK transient是唯一不使用ORM模型映射列的方法。如果一个字段没有映射到数据库,那么Hibernate怎么可能给它赋值呢?@TimBiegeleisen我的想法是执行SQL查询,例如
select t.*,1作为表t中的禁用项
,那么所有其他字段都来自该表,我所说的
禁用的
字段是从该查询返回的记录集的
禁用的
列加载的。我不确定我是否理解您的问题。该字段的值从何而来?它是在数据库中还是某个公式的结果?@Thomas OK,我刚才在评论中给出了一个例子。最适合您需要的是执行原始SQL查询。您正试图绕过Hibernate框架,在这种情况下,为什么不直接执行原始查询呢?AFAIK transient是不使用ORM模型映射列的唯一方法。如果一个字段没有映射到数据库,那么Hibernate怎么可能给它赋值呢?@TimBiegeleisen我的想法是执行SQL查询,例如
select t.*,1作为表t中的禁用项
,那么所有其他字段都来自该表,我所说的
禁用的
字段是从该查询返回的记录集的
禁用的
列加载的。我不确定我是否理解您的问题。该字段的值从何而来?它是在数据库中还是某个公式的结果?@Thomas OK,我刚才在评论中给出了一个例子。最适合您需要的是执行原始SQL查询。您正试图绕过Hibernate框架,在这种情况下,为什么不直接执行原始查询呢?我知道这是
updateable
的事情,但我的问题是我没有一个列来映射此字段。所以我根本不希望它映射到物理表列。无论如何,谢谢。然后用瞬态法,如果你想从另一个表中得到这个值,你可以用这个公式,我不知道这是可能的。好的,我会在这方面做一些研究,谢谢。我知道这个
updateable
的东西,但我的问题是我没有一个列来映射这个字段。所以我根本不希望它映射到物理表列。无论如何,谢谢。然后用瞬态法,如果你想从另一个表中得到这个值,你可以用这个公式,我不知道这是可能的。好的,我会在这方面做一些研究,谢谢。但是如果我加载100个实体,这不会触发对数据库的100个单独查询吗?如果是这样的话,我不希望这样。只有当DB被要求时,它才会调用DB。但是一天结束时,如果你想检索100个不同实体的信息,它需要到数据库中去100次。也许您可以考虑使用它来检索所有实体名称,只需一次往返数据库。然后将结果映射到正确的实体。是的,这就是我试图找到的,如何通过一次到数据库的往返来实现。您也可以直接使用jdbc访问数据库,只需检索您之前加载的所有实体的名称和id。然后,您可以使用将结果映射到每个实体