1. HQL
HQL(Hibernate Query Language)提供更加丰富灵活、更为强大的查询能力
针对于项目中实体类,在查询的时候,from 后面必须是实体类.自然要遵循类的命名规则,区分大小写。
1.1.查询
/** * * @Description:查询所有数据 注意单词别写错! * @author mengqx * @date 2017年8月31日 */ @Test public void getAll() { // 创建session对象 Session session = HibernateUtils.getSession(); // 通过createQuery方法取得所有数据。每次去查询的时候去调用了无参构造函数。 // oracle 数据库中正常查询数据的sql语句:select * from stu order by id; // 如果单词stu为小写的话。则会出现如下错误stu is not mapped 没有映射。。。 // 数据库跟实体类的映射关系。。。。 List<Stu> list = session.createQuery("select new Stu(id,name,pwd) from Stu order by id").list();
for (Stu stu : list) { System.out.println(stu); } session.close(); }
@Test public void getIdAndName() { // 创建session对象 Session session = HibernateUtils.getSession(); // 查询某几个字段通过观察getAll说明在走查询的时候,走的应该是构造函数。 // no appropriate constructor in class: com.bjsxt.pojo.Stu // 通过看此异常,可以为Stu类添加一个构造器 List<Stu> list = session.createQuery("select new Stu(id,name) from Stu order by id").list();
for (Stu stu : list) { System.out.println(stu); } session.close(); } |
1.2.新增
HQL:不支持新增!
1.3.修改
@Test public void update() { Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction(); // 修改语句:传入参数可以是? ,? 代表占位符。给占位符传值:使用setParameter(). // 该方法第一个参数是代表第几个问号,下标从0开始,第二个参数表示给?传入的具体值。 // Query query = session.createQuery("update Stu set name = ? where id = // ?").setParameter(0, "c204").setParameter(1, 64); // 第二种给?传值方式使用setString() ,setInteger(). 具体使用那个一种类型是根据字段类型决定的! Query query = session.createQuery("update Stu set name = ? where id = ?").setString(0, "c2042").setInteger(1, 64); // query.executeUpdate();执行上述定义的修改语句。 int result = query.executeUpdate();
System.out.println(result); transaction.commit(); session.close();
} |
1.4.删除
@Test public void delete() { Session session = HibernateUtils.getSession(); Transaction transaction = session.beginTransaction(); Query query = session.createQuery("delete from Stu where id = ?").setInteger(0,64); // query.executeUpdate();执行上述定义的修改语句。 int result = query.executeUpdate(); System.out.println(result); transaction.commit(); session.close(); } |
1.5.模糊查询
/** * * @Description: like 模糊查询的时候,要使用|| 进行拼接。 可以使用?来代替参数。 模糊查询传值还可以使用 :变量名 :name * @author mengqx * @date 2017年8月31日 */ @Test public void like() { Session session = HibernateUtils.getSession(); // oracle --- select * from stu where name like '%li%' // '%'+"li"+'%' // List<Stu> list = session.createQuery("from Stu where name like '%'|| // ? ||'%'").setParameter(0, "li").list(); // List<Stu> list = session.createQuery("from Stu where name like '%'|| :name ||'%'").setParameter("name", "li") .list(); for (Stu stu : list) { System.out.println(stu); } session.close(); } |
1.6.分页查询
@Test public void page() { Session session = HibernateUtils.getSession(); // 分页查询必须有当前页,每页显示的条数 // select * from ( // select e.* ,rownum r from ( // (select * from stu order by id) // )e where rownum <=5 // ) where r>=1
int pageIndex = 3; // 分页语句从第几条开始查:(pageIndex-1)*pageSize int pageSize = 3; List<Stu> list = session.createQuery("from Stu order by id").setFirstResult((pageIndex - 1) * pageSize) .setMaxResults(pageSize).list(); for (Stu stu : list) { System.out.println(stu); } session.close(); } |
1.7.聚合函数应用
@Test public void count() { Session session = HibernateUtils.getSession(); // 聚合函数查询要使用uniqueResult();该方法返回一个Object。不能强制转换成int,Integer,只有Long,Object可以输出显示。 Long result = (Long) session.createQuery("select count(*) from Stu ").uniqueResult(); session.close(); System.out.println(result); } |