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
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
相关文章推荐
- Python学习(五)---使用dict和set
- Linux 下如何查找指定端口被哪个进程占用 lsof
- C#中比较字符串的方法
- The Art Of Unix Programming ---part 1
- 坑爹的NVARCHAR2
- 做一个牛XX的身份证号验证类(支持15位和18位)
- Could not find *.apk!解决办法
- 网站接入支付宝
- Hadoop MR Job 关于如何控制Map Task 数量
- 什么是mime类型
- Python xml属性/节点/文本的增删改[xml.etree.ElementTree]
- 解决无法安装SQL Server 2008 Management Studio Express的问题
- C++学习 boost::optional详解
- Sqoop将MySQL和Oracle的数据导入HIVE和Hbase
- 通过 bitbake 移植 qrencode 到嵌入式
- dBm与mW的转换
- IAR for STM8 错误
- Android 动画学习(一)之View Animation
- android源码编译出现/usr/bin/ld: cannot find -llzo2 /usr/bin/ld: cannot find -luuid
- jmx监控spark executor配置