使用休眠的本机查询

Posted

技术标签:

【中文标题】使用休眠的本机查询【英文标题】:using native query of hibernate 【发布时间】:2013-07-27 16:45:33 【问题描述】:

我有一个查询是,我正在使用 Hibernate,我必须检索记录,查询包括不同表之间的内部连接和 某些条件如下所示..

SELECT ru.* FROM rruser ru
inner join rruser_group rg ON ru.id = rg.user_id
inner join rrgroup_permission rgp ON rg.group_id = rgp.group_id
inner join rrpermission rp ON rgp.permission_id = rp.id WHERE ru.ACTIVE_FLAG='Y' AND rp.name='write'

现在我想将它嵌入到休眠中,所以我希望它被用作休眠的本机查询,就像这样..

Query query = session.createSQLQuery("SELECT ru.* FROM rruser ru
inner join rruser_group rg ON ru.id = rg.user_id
inner join rrgroup_permission rgp ON rg.group_id = rgp.group_id
inner join rrpermission rp ON rgp.permission_id = rp.id WHERE ru.ACTIVE_FLAG='Y' AND rp.name='write'")
List result = query.list();

如上所示,它将返回一个对象数组,现在请告知我是否可以在我的其他 pojo 中使用它,我需要这些记录由上述查询过滤,因为我需要在另一个 pojo 中查询的最终记录在那个pojo中,我将如何称呼这个查询,请告知

【问题讨论】:

【参考方案1】:

所以简短的回答是你不要在你的 pojo 中放任何这种代码,从here 阅读什么是实体 bean。所以你的 bean 可以有字段、getter 和 setter 以及关系,仅此而已。来自链接的示例 pojo:

@Entity
public class Customer 



    String name;

      public String getName () 
        return name;
      

      public void setName (String name) 
        this.name = name;
      

      int age;

      public int getAge () 
        return age;
      

      public void setAge (int age) 
        this.age = age;
      

      Date signupdate;

      public Date getSignupdate () 
        return signupdate;
      

      public void setSignupdate (Date signupdate) 
        this.signupdate = signupdate;
      
      

那么你想把代码放在哪里,所以你想把它放在服务层,在那里它将是事务性的。 示例:

    @Transactional
    public class MyServiceImpl implements MyService 
        private MyDao myDao;
        private EntityManager em; 

        public List selectSomeData() 
            Query query = session.createSQLQuery("SELECT ru.* FROM rruser ru
inner join rruser_group rg ON ru.id = rg.user_id
inner join rrgroup_permission rgp ON rg.group_id = rgp.group_id
inner join rrpermission rp ON rgp.permission_id = rp.id WHERE ru.ACTIVE_FLAG='Y' AND rp.name='write'")
return query.list();
        
        ...
    
    

您将在应用程序上下文中创建这个 bean,它将是单例的,每个人都使用它的实例。因此,无论何时您想拨打电话,都可以从该服务中拨打电话。

也看到这个很棒的answers

【讨论】:

以上是关于使用休眠的本机查询的主要内容,如果未能解决你的问题,请参考以下文章

休眠:- 未找到本机查询异常

Spring - 当列名与模型中的名称不同时,本机查询与休眠混合

返回休眠本机 sql 查询

为啥在本机查询 Hibernate 延迟加载的子实体中?

本机存储过程与休眠

我可以在不创建实体类的情况下对大型 sql 使用休眠命名查询吗?