hibernate使用hql跨表查询遇到的问题以及解决方式

有时遇到项目使用hibernate来实现dao层操作。hibernate中定义了对象与表的映射关系,各对象定义了与关联表的1:1或1:n等关系。

1.要做两表关联查询时hql语句怎么写?

假设人员对象Person和联系地址Address对象是1:n关联

查询的hql不能这样写是错误的:

select p from Person p left join Address a on a.id = p.address.id

而应该这样写:

select p from Person p left join p.address a where a.id=p.address.id
                          --------                --------------
                          对象             对象中定义的映射关系


2.跨表查询

   @Servcie
   public class XXXServiceImpl {  
        @Autowired
        private EntityManagerFactory emf;
    
        public List<Person> findByConditions(String name, String addressName, int pageNo, int itemPerPage){

            EntityManager em = this.emf.createEntityManager();
            String hql = "select p from Person p left join p.address a where a.id=p.address.id and  p.name like :name and addressName like :addressName";  
            Query q = em.createQuery(hql); 
            //设置查询参数, 这里没有判断是否为空,最好根据是否为空来生成hql和设置参数
            q.setParameter("name", "%"+name+"%");    
            q.setParameter("addressName", "%"+addressName+"%");   
            //设置查询结果中第一个对象的位置(指定查询的起始记录)
            q.setFirstResult(pageNo*itemPerPage); 
            //设置查询结果中对象的最大数量(指定查询结果的条数)
            q.setMaxResults(itemPerPage);  
            //可以自己写个方法去查询出总记录数后传给size   
            int size = 3;
            //文档说PageRequest可以为null
            Page<Person> page = new PageImpl<Person>(q.getResultList(), new PageRequest(pageNo,itemPerPage), size); 
            //不分页的可以直接调用return q.getResultList();
            return page.getContent();  
    }


参考:http://wenku.baidu.com/link?url=5ZDPKiCgIQ9qapcqLsbfKb619VI2GsCdQChZ3jP7i5BPeK-oyGvD8e1dKfXSUBLC9i7-vAQXos4qc4M--4eN1_Lm_kK4fZbH1SoqX7mfML7

         http://sishuok.com/forum/blogPost/list/7000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值