您的位置:首页 > 其它

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

2015-06-16 16:43 531 查看
有时遇到项目使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: