Hibernate Query Language
在Hiberante中所支持的查询有:
n OID检索方式
Ø OID对象标始符,按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。
n HQL检索方式
Ø 使用面向对象的HQL查询语言。Session的find()方法用于执行HQL查询语句。此外,Hibernate还提供了Query接口,它是Hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句。
n QBC检索方式
Ø 使用(Query ByCriteria)API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更面向对象的接口。
n 本地SQL检索方式
Ø 使用本地数据库的SQL查询语句。Hibernate会负责把检索到的JDBC ResultSet结果集映射成为对象图。
这里重点写写HQL和QBC,举一些常用的方法,具体还要到API中去查询了:
1. Query查询(推荐使用)
- String hql =”from Users as user”;
- String hql =”from Users ”;
- String hql =”from Users as u”;
- String hql =”from Users user”;
a.设置占位符(必须一一对应)
- String hql ="from Users u where u.uid=? and u.uname=?";
- Query query = session.createQuery(hql);//相当于JDBC中的预编译
- query.setString(0, 1+"");//下标从零开始
- query.setString(1,"ysjian");
- //但确定结果只有一个时可以用uniqueResult(),如果不止一个,会抛异常
- Usersuser = (Users)query.uniqueResult();
b.设置名称(要求名称对应就可以格式:u.uname=:uname)
- String hql = "from Users u where u.uid=:uid andu.uname=:uname and u.age > :min";
- Queryquery = session.createQuery(hql);
- query.setString(“uname”, "ysjian");
- query.setString(“uid”,1+"");
- query.setInteger(“min”,22);
还可以这么设置:
- Query query =session.createQuery(
- "from User u where u.uname = :name andu.uid > :uid")
- .setString("name","ysjian").setInteger("uid", 1);
c.分页查找
- String hql = "from Users u ";
- Queryquery = session.createQuery(hql);
- query.setFirstResult(0);//从第一个开始
- query.setMaxResults(10);//取十个
d.模糊查询
//模糊查询,与sql语句查询语法一致
- String hql = "from UserInfowhere uname like '%ysj%'";
- Query query =session.createQuery(hql);
- List<UserInfo> list = query.list();
e.不完整列查询
- <span style="WHITE-SPACE: pre"> </span>String hql = "select uname,upass fromUserInfo";
- Queryquery = session.createQuery(hql);
- List<Object[]>list = query.list();
- //当查询不完整列时返回的List集合装的是Object[]
- for (Object[] object : list) {
- for(Object object2 : object) {
- System.out.print(object2+"-->");
- }
- System.out.println();
- }
- HibernateSessionFactory.closeSession();
à不完整查询返回对象的解决方案
- //在实体类中增加一个含有要查询属性名参数的构造方法
- String hql = "select new com.query.entity.Userinfo( uname,upass) fromUserInfo";
- Queryquery = session.createQuery(hql);
- f.sql语法查询
- String sql = "select * fromuserinfo";
- SQLQuerysqlQuery = session.createSQLQuery(sql);//创建sql查询
- sqlQuery.addEntity(UserInfo.class);//给对应的实体对象
- List<UserInfo> list =sqlQuery.list();
g.子查询
- String hql ="select f from Fileinfo f "+ "wheref.userinfo.uid in(select u.uid from
- Userinfo u where u.state=1)";
- Query query =session.createQuery(hql);
h.连接查询
- String hql = "select ffrom Fileinfo f, Userinfo u " +"where u.state = 1 and f.userinfo.uid=u.uid";
- Query query = session.createQuery(hql);
------------------------------------------------------------------------------------
- String hql = "select ffrom Userinfo u inner join u.fileinfos f where u.state=1 and u.uid=3";
- Query query = session.createQuery(hql);
2. Criteria查询
- //uname是Users类中的属性,查找uname为ysjian的对象
- // criteria.add(Restrictions.eq("uname","ysjian"));
- // Object obj = criteria.uniqueResult();
- // System.out.println(obj);
- // 表示查找uid大于2的对象,不包括2,Restriction是约束的意思
- // criteria.add(Restrictions.gt("uid", 2));
- // 表示查找uid小于3,不包括3,的对象,Restriction是约束的意思
- criteria.add(Restrictions.lt("uid", 5));
- //分页查找
- criteria.setFirstResult(0);
- criteria.setMaxResults(2);
- //模糊查找
- criteria.add(Restrictions.ilike("uname", "%ysj%00%"));
- criteria.add(Restrictions. like("uname", "%ysj%00%"));
- //排序查找
- criteria.add(Restrictions.like("upass", "0",MatchMode.END));//以0结尾的
- // criteria.add(Restrictions.like("upass", "0",MatchMode.START));//以0开始的
- // criteria.add(Restrictions.like("upass", "0",MatchMode.ANYWHERE));//包含0的
- // criteria.add(Restrictions.like("uname", "yyy",MatchMode.EXACT));//精确查询
- criteria.addOrder(Order.desc("uid"));//添加以uid降序排列
- List<Userinfo> list = criteria.list();
- List<Users> list = criteria.list();
- for (Users users : list) {
- System.out.println(users);
- }