Hibernate的数据库查询操作

来源:互联网 发布:地热模拟软件 编辑:程序博客网 时间:2024/04/30 10:46
一、对表中的所有的数据进行查询,不可以使用select * 子句,直接使用from 对象的形式进行查询
/**
* 查询所有User
* @return List结果集合
*/
public List<User> findUser(){
Session session = null; //声明Session对象
List<User> list = null;
try {
//获取Session
session = HibernateUtil.getSession();
session.beginTransaction(); //开启事务
String hql = "from User "; //HQL语句,User是持久化类
//创建Query对象
Query query = session.createQuery(hql);
list = query.list(); //获取查询结果集
//提交事务
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//出错将回滚事务
session.getTransaction().rollback();
}finally{
//关闭Session对象
HibernateUtil.closeSession();
}
return list;
}
二、查询一部分字段
String hql = "select new User(id,name) from User "; //HQL语句,User是持久化类
查询出id,name并实例化为User对象

三、条件查询
String hql = "from User uwhere u.id=1 "; //HQL语句,User是持久化类
查询id为1的数据。u为 一个对象

四、使用?代替参数
String hql = "from User uwhere u.id=?"; //HQL语句,User是持久化类
Query query = session.createQuery(hql);
query=query.setParameter(0,4);=//从0开始的,代表第一个问号,设置参数为4,即id=4

五、对象导航查询
Session session = null; //声明Session对象
//开启第一个session
try {
//获取Session
session = HibernateUtil.getSession();
//开启事务
session.beginTransaction();
//HQL查询语句
String hql = "from Medicine m wherem.category.name = ?";
//之所以是m.category.name是因为持久化对象Medicine中有一个属性是持久化 对象Category
//创建Query对象并对HQL动态赋值
Query query = session.createQuery(hql)
.setParameter(0, "感冒用药");

//获取查询结果集
List<Medicine> list = query.list();
response.setCharacterEncoding("GBK");
PrintWriter out=response.getWriter();
//循环输出类别"感冒用药"中的药品名称
for(Medicine m : list){
out.println("感冒用药: " + m.getName()+"<br>");
}
out.flush();
out.close();
//提交事务
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//出错将回滚事务
session.getTransaction().rollback();
}finally{
//关闭Session对象
HibernateUtil.closeSession();
}

六、排序查询
from User u order by u.id asc//升序
from User u order by u.id desc//降序

七、聚合函数查询
在HQL查询语言中,支持常用的聚合函数的使用,比如 Sum,min,max,count等等,其使用的方法和SQL语句基本相同

select count(*) from User u//查询User对象所对应的数据表中的记录数
select max(u.id) from User u//查询User对象所对应表中最大的id值

八、分组操作
通常使用group by子句进行分组操作,也可搭配having子句
//获取Session
Session session = HibernateUtil.getSession();
session.beginTransaction(); //开启事务
//HQL语句,通过部门进行分组查询
String hql = "selectu.dept,count(*) from User ugroup by u.dept";
//创建Query对象
Query query = session.createQuery(hql);
//获取结果集
List<Object[]> list = query.list();
//循环输出部门名称及人数
for (Object[] obj : list) {
System.out.print("部门: " + obj[0] + "---");
System.out.println("人数: " + obj[1]);
}
//提交事务
session.getTransaction().commit();

九、对时间进行查询
可以使用等号=进行时间的精确匹配,也可以使用between.. and子句查询指定的时间范围,也可以使用date_format()函数进行时间的模糊查询。
//获取Session
Session session = HibernateUtil.getSession();
session.beginTransaction(); //开启事务
//HQL语句
String hql = "from User u where date_format(u.birth,'%Y-%m') = ?";
//创建Query对象
Query query = session.createQuery(hql)
.setParameter(0, "1984-01");
//获取结果集
List<User> list = query.list();
System.out.println("1984年1月出生的用户有:");
//循环输出1984年1月出生的用户姓名及出生日期
for (User user : list) {
System.out.print("姓名: " + user.getName() + "\t");
System.out.println("出生日期: " + user.getBirth());
}
//提交事务
session.getTransaction().commit();

十、联合查询
关于连接的详细解释
http://blog.csdn.net/seanb/article/details/51594234
一般使用内连接
1、 查两表关联列相等的数据用内连接。
2、 Col_L是Col_R的子集时用右外连接。
3、 Col_R是Col_L的子集时用左外连接。
4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
5、 求差操作的时候用联合查询。
Session session = null; //声明Session对象
List<Object[]> list = null;
try {
//获取Session
session = HibernateUtil.getSession();
//开启事务
session.beginTransaction();
//HQL查询语句
String hql = "select m.id,m.name,m.price,m.factoryAdd,c.name from Medicine minner join m.category c";
//创建Query对象并获取结果集
list = session.createQuery(hql)
.list();
//提交事务
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//出错将回滚事务
session.getTransaction().rollback();
} finally {
//关闭Session对象
HibernateUtil.closeSession();
}

十一、子查询
// HQL语句
String hql = "select med.name from Medicine medwheremed.price = (select max(price) from Medicine)";
先查询药品中价格最贵的,并找到其名称

以上内容参考至《JavaWeb开发实战》
0 0
原创粉丝点击