从SQLQuery结果中的id列获取Hibernate Entity实例

时间:2009-04-28 09:55:33

标签: java sql hibernate

我有(非Hibernated)数据库表,其中包含Hibernate实体的ID。我可以查询它们(使用createSQLQuery),它给了我id,然后我可以从中加载实体。

我想一步到位,我想我可以用addEntity做到这一点,但我不确定究竟是多少。 (Hibernate的文档网站已关闭。再次。)当实体表的所有列都存在时,我可以使用addEntity,但我现在只有id。

这抱怨缺少的栏目:

return (List<MyEntity>) session.createSQLQuery(
            "select entity_id from the_table where foreign_key_value = ?")
            .addEntity("entity_id", MyEntity.class)
            .setLong(0, foreignKey).list();

3 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

session.createSQLQuery("select {entity.*} from entity_table {entity} where ....")
  .addEntity("entity", Entity.class).(bind-parameters).list();

Hibernate会将“{entity。*}”扩展为entity_table的相关列。

虽然如果你已经有了ID,你可以简单地使用session.load()将它们转换为实际的实例(好吧,延迟加载代理)。

答案 1 :(得分:0)

我会使用连接

select * 
from entity_table 
where entity_id = (select entity_id
                   from non_hibernate_table
                   where id = ?)

答案 2 :(得分:0)

对于oracle方言。如果你将数据库列类型映射到java数据类型有问题你可以手动设置它:.addScalar("integerFieldName", Hibernate.INTEGER)

public class LookupCodeName
{
    private String code;
    private String name;

 /*... getter-setters ... */
}

public class someBL {

public List<LookupCodeName> returnSomeEntity() {
      SQLQuery sqlQuery =  (SQLQuery)((HibernateSession)em).getHibernateSession()
                .createSQLQuery( "SELECT st.name as name, st.code as code FROM someTable st")
                .addScalar("code")
                .addScalar("name")
.setResultTransformer(Transformers.aliasToBean(LookupCodeName.class));
    }
return (List<LookupCodeName>)sqlQuery.list();
}