HQL(hibernate Query Language) —一种面向对象的查询。
HQL对关键字的大小不区分,但是对查询的对象就要区分大小写。在sql中,如果要加条件的话就是列,在HQL中,条件就是对象的属性,而且要给对象起别名。
1.hibernate 一般查询
1)限制查询起始与结果
Query query=session.createQuery("from News");
query.setFirstResult(1);
query.setMaxResults(3);
List list=query.list();
for(int i=0;i<list.size();i++) {
News news=(News) list.get(i);
System.out.println(news.getNewsID()+":"+news.getName()+":"+news.getPhone());
}
2)条件查询
Query query=session.createQuery("from News news where news.name='11'");
List list=query.list();
for(int i=0;i<list.size();i++) {
News news=(News) list.get(i);
System.out.println(news.getNewsID()+":"+news.getName()+":"+news.getPhone());
}
news为News对象的别名,name不是数据表中的字段,而是cus对象中的属性name
2.取表中的部分列
1)单一属性查询,集合中是对象而不是表的实例
List names=session.createQuery("select name from News").list();
for(int i=0;i<names.size();i++) {
String name= (String) names.get(i);
System.out.println(name);
}
2)多个属性的查询,使用对象数组
List dept=session.createQuery("select deptno,dname from Dept").list();
for(int i=0;i<dept.size();i++) {
Object[] object= (Object[]) dept.get(i);
System.out.println(object[0]+":"+object[1]);
这里注意,查询多个属性,其集合元素是对象数组,数组元素的类型,跟实体类的属性的类型相关。
3)多个属性的查询使用List集合存储部分列
Query query=session.createQuery("select new list(news.name,news.phone) from News news");
List list=query.list();
for(int i=0;i<list.size();i++) {
List temp=(List) list.get(i);
System.out.println(temp.get(0)+":"+temp.get(1));
}
```这种方法查询得到的结果集合中的存储是表的实例。所以temp.get(0)对应news.name
4)使用Map集合存储部门列
<div class="se-preview-section-delimiter"></div>
这里写代码片
“`
Query query=session.createQuery("select new map(news.name,news.phone) from News news");
List list=query.list();
for(int i=0;i<list.size();i++) {
Map temp= (Map) list.get(i);
System.out.println(temp.get("11"));
}
这里也是表的实例,以Map的形式存储,其中的Key为数据记录中的键码
由于内连接与外连接在此处实现起来比较麻烦,所以此处不给出代码,读者有兴趣可以自行查阅资料。
3.带参数的查询
1)?作为参数
Query query=session.createQuery("from News news where news.name=?");
query.setParameter(0, "11");
List list=query.list();
for(int i=0;i<list.size();i++) {
News news=(News) list.get(i);
System.out.println(news.getNewsID()+":"+news.getName()+":"+news.getPhone());
}
2)参数名称
Query query=session.createQuery("from News news where news.name=:name");
query.setParameter("name", "11");
List list=query.list();
for(int i=0;i<list.size();i++) {
News news=(News) list.get(i);
System.out.println(news.getNewsID()+":"+news.getName()+":"+news.getPhone());
}
3)条件查询,使用?方式穿参
Query query=session.createQuery("from News news where news.name LIKE ?");
query.setParameter(0, "%1%");
List list=query.list();
for(int i=0;i<list.size();i++) {
News news=(News) list.get(i);
System.out.println(news.getNewsID()+":"+news.getName()+":"+news.getPhone());
}
也可以使用 :参数的形式
与上面极其类似,这是不再赘述
4嵌入原生sql测试
SQLQuery sqlquary=session.createSQLQuery("select * from News");
List news=sqlquary.list();
for(Iterator iter =news.iterator();iter.hasNext();) {
Object[] obj=(Object[]) iter.next();
System.out.println(obj[0]+"---------------------"+obj[1]+"------"+obj[2]);
}
这里不再是HQL了,是原生的sql语句,所以得到的查询结果对象不再是Query而是SQLQuery