Hql语句学习:
(1)Hql初步认识
① Hql是面向对象查询语言,查询时用的是类名和属性名;Sql 查询时用的是表名和字段名
② 大小写敏感
③ 包名:如果类名没有重复的话,不用写包名,如果不同包下面有相同的类,那么需要加包名。
(2)hql使用
a. 获取唯一值
String hql="select count(*) from Student";
Query q=session.createQuery(hql);
Number number=(Number) q.uniqueResult();//返回一条数据
System.out.println(number.intValue());
b. 获取一张表所有字段
String sqlString="from Student";
Query query=session.createQuery(sqlString);
List list=query.list();
for(int i=0;i<list.size();i++)
{
Student student=(Student) list.get(i);
System.out.println(student.getName()+" id:"+student.getId());
}
c. 返回一张表部分字段
String hqlString="select s.sNo,s.name from Student s";
Query query=session.createQuery(hqlString);
List<Object[]> list=query.list();
for(int i=0;i<list.size();i++)
{
Object[] objects=list.get(i);
System.out.println(objects[0]+"---"+objects[1]);
}
d. 两张表连接查询(例如:一对一关系中)
String hqlString="select c.name,c.addressId.city,c.addressId.country from CompanyXML c";
Query query=session.createQuery(hqlString);
List<Object[]> list=query.list();
for(int i=0;i<list.size();i++)
{
Object[] objects=list.get(i);
System.out.println(objects[0]+"---"+objects[1]);
}
e. 使用Map封装一行记录(起别名,相当于键名)
String hqlString="select new map(c.name as name,c.addressId.city as city,c.addressId.country as country) from CompanyXML c";
Query query=session.createQuery(hqlString);
List<Map> list=query.list();
for(int i=0;i<list.size();i++)
{
Map map=list.get(i);
System.out.println(map.get("name")+"---"+map.get("city"));
}
f. javaBean封装(获取部分字段) 可以通过构造函数封装
String sqlString="select new Student(s.sNo,s.name,s.schoolName) from Student s";
Query query=session.createQuery(sqlString);
List list=query.list();
for(int i=0;i<list.size();i++)
{
Student student=(Student) list.get(i);
System.out.println(student.getName()+" id:"+student.getSchoolName());
}
g. Where字句的用法 条件查询
//String hqltestString="from Student s where s.name=? ";//通过位置进行查找,参数索引从0开始
String hqltestString="from Student s where s.name=:name ";//动态绑定 通过名字进行绑定
Query query=session.createQuery(hqltestString);
query.setString("name", "ytt");
List list=query.list();
for(int i=0;i<list.size();i++)
{
Student student=(Student) list.get(i);
System.out.println(student.getName()+" id:"+student.getSchoolName());
}
h. 分页查询
String sqlString="from Student";
Query query=session.createQuery(sqlString);
query.setFirstResult(0);//从第几条开始
query.setMaxResults(10);//一页显示多少条
List list=query.list();
for(int i=0;i<list.size();i++)
{
Student student=(Student) list.get(i);
System.out.println(student.getName()+" id:"+student.getId());
}
i. 内连接、外连接
String hqljoin="select s.name,b.picture from Student s ,Book b";//如果使用join会出现异常
Query query=session.createQuery(hqljoin);
List<Object[]> list=query.list();
for(int i=0;i<list.size();i++)
{
Object[] object=list.get(i);
System.out.println(object[0]+"--"+object[1]);
}
(3)Sql语句的使用
原生sql(直接使用sql语句就行 和数据库中的写法相同,查询时使用SQLQuery)
String sqlString="select s.sNo,s.name from Student s where s.name=:name";
SQLQuery sqlQuery=session.createSQLQuery(sqlString);
sqlQuery.setString("name", "ytt");
//sqlQuery.addEntity(Student.class);//相当于from Student,结果可以与Student表中的数据相对应起来,直接通过javaBean获取属性即可
List<Object[]> list1=sqlQuery.list();
for(int i=0;i<list1.size();i++)
{
Object[] object=list1.get(i);
System.out.println(object[0]+"--"+object[1]);
}