浅谈Hibernate--Hibernate查询(Query Language)
![此博文包含图片](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
分类: Hibernate |
1.查询对象:Query有org.hibernate.query和javax.persistence.query,
用法如下
如果按条件查找
2.占位符:比如下面的例子:min 和:max,和query.setParameter(key,value);
链式的也可以,同时这里setParameter("","")是会自动设置参数的值,如果知道传入的类型可以setInteger..
3.分页效果:
通过query.setMaxResult(n).setFirstResult(m)取出m~n之间的记录
setFirstResult(m):选择从第几行开始取,默认是row0
setMaxResult(n):决定取出多少条记录,默认是往后所有rows
和下面普通的ql语句实现一样
4.获取子属性
Query query=session.createQuery("from Score s where s.xxx.id=..")
同时也可以把临时对象取出来放到Object或者自己建立的辅助类里去
1.Query query=session.createQuery("select s.name,c.name from Student s,Course c where s.id=.. and c.id=..")
2.Query query=session.createQuery("select new VObj(s.name,c.name) from Student s,Course c where s.id=.. and c.id=..")
取出部分属性封装成一个新的对象是不可取的,最好完整的取出整个属性以保证他逻辑的关联性;
如果要取出就这样取
5.单个对象匹配
如果你知道取出的是唯一的一个对象,那么就不用query.list(),要用query.uniqueResult();效率比较高
count(*)返回的是一个long类型
in
Group by
select avg(s.age) from Student group by s.col;
having
select count(*) from Student s where group by s.col having count(*)>3;
空值Empty:下面是学生类(Student)中有Set<Course> courses属性(学生所选课程) 选出哪些选课为空的学生
Like: %多个 ; _ 一个
distinct
6.可以把QL语句放在一起,以便维护修改用@NamedQueries和@NamedQuery,调用的时候用session.getNamedQuery(QueryName)
7.使用数据库自身语言
如果用hql解决不了问题,那就用sql语言来解决,通过createSQLQuery()来搜索表,并用addEntity(xx.Class)转换成对象
当然这也可以用命名的Query
8.批量删除:通过query.executeQuery();return一个int类型,返回update和delete成功的行数
![浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/ef13da99ccc8820d54499b5810434cb0.jpeg)
如果按条件查找
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/f9e0250a41620721ad96c1307bab9861.jpeg)
2.占位符:比如下面的例子:min 和:max,和query.setParameter(key,value);
![浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/61147f700f8e451256c95fc6f3f1d60e.jpeg)
链式的也可以,同时这里setParameter("","")是会自动设置参数的值,如果知道传入的类型可以setInteger..
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/566f8464c226c79abdabf9db5e406f59.jpeg)
3.分页效果:
通过query.setMaxResult(n).setFirstResult(m)取出m~n之间的记录
setFirstResult(m):选择从第几行开始取,默认是row0
setMaxResult(n):决定取出多少条记录,默认是往后所有rows
和下面普通的ql语句实现一样
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/38c81d37a64350b9eb275926f03e1002.jpeg)
4.获取子属性
Query query=session.createQuery("from Score s where s.xxx.id=..")
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/7bb17664438e6857e188d546f62e246a.jpeg)
同时也可以把临时对象取出来放到Object或者自己建立的辅助类里去
1.Query query=session.createQuery("select s.name,c.name from Student s,Course c where s.id=.. and c.id=..")
2.Query query=session.createQuery("select new VObj(s.name,c.name) from Student s,Course c where s.id=.. and c.id=..")
取出部分属性封装成一个新的对象是不可取的,最好完整的取出整个属性以保证他逻辑的关联性;
如果要取出就这样取
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/60dfb87849c44139f7bf147749458454.jpeg)
5.单个对象匹配
如果你知道取出的是唯一的一个对象,那么就不用query.list(),要用query.uniqueResult();效率比较高
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/21276e438e11b47defd5869c2ff9e4f3.jpeg)
count(*)返回的是一个long类型
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/97fa179e6d813e47e015c6e9ea2b864a.jpeg)
in
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/ba29da356222fa06849aa8318c5baed4.jpeg)
Group by
select avg(s.age) from Student group by s.col;
having
select count(*)
空值Empty:下面是学生类(Student)中有Set<Course> courses属性(学生所选课程) 选出哪些选课为空的学生
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/e6ba3dc9d1c45a5b453cb1195557e69f.jpeg)
Like: %多个 ; _ 一个
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/8fd650f3eb90cd62558fc897f6a272a2.jpeg)
distinct
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/0ca5d08705595bbb176021735a038303.jpeg)
6.可以把QL语句放在一起,以便维护修改用@NamedQueries和@NamedQuery,调用的时候用session.getNamedQuery(QueryName)
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/ae04e4564b52abfebad595527d5ce6d1.jpeg)
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/b04517bca45ab28a561cb98f961a178d.jpeg)
7.使用数据库自身语言
如果用hql解决不了问题,那就用sql语言来解决,通过createSQLQuery()来搜索表,并用addEntity(xx.Class)转换成对象
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/78bbc00591248a43151ef6563d5979c6.jpeg)
当然这也可以用命名的Query
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/c20ace7733a01bc2a9a13c246c62b272.jpeg)
8.批量删除:通过query.executeQuery();return一个int类型,返回update和delete成功的行数
![浅谈Hibernate--Hibernate查询(Query <wbr>Language) 浅谈Hibernate--Hibernate查询(Query <wbr>Language)](https://i-blog.csdnimg.cn/blog_migrate/00d96ca62de67f7ffa356632fb6c7a7f.jpeg)