【问题标题】:Get Hibernate Entity instance from id column in SQLQuery result从 SQLQuery 结果中的 id 列获取 Hibernate Entity 实例
【发布时间】:2009-04-28 09:55:33
【问题描述】:

我有(非休眠)数据库表,其中包含休眠实体的 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();

【问题讨论】:

  • 你遇到过这个吗?

标签: java sql hibernate


【解决方案1】:

我想你想要这样的东西:

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

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

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

【讨论】:

    【解决方案2】:

    我会使用连接

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

    【讨论】:

    • 可以这样做,但我会做 Hibernate 的工作 :-) 另外,这会跳过延迟加载和实体缓存。
    【解决方案3】:

    对于甲骨文方言。如果您在将数据库列类型映射到 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-26
      • 2020-05-10
      • 2012-11-10
      • 2010-10-12
      • 2019-07-08
      • 1970-01-01
      • 2014-11-09
      • 2016-07-10
      • 1970-01-01
      相关资源
      最近更新 更多