數據查詢是hibernate的一個亮點,hibernate為程序猿提供了多種的查詢方式,分為以下三種:
1.hibernate語言查詢,也就是我們今天需要說的hql查詢,這種查詢是完全面向對象的方式來查詢,將查詢語句封裝為對象來進行操作。符合面向對象的思維來維護數據庫。
2.hibernate標准化查詢:(criteria query)將查詢語句封裝成對象進行操作。
3.原聲sql查詢:直接使用標准sql語言來進行查詢。
在學習hql查詢之前,我先插入一些記錄到userinfo表中:
//解析hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//創建SessionFactory(創建連接池)
SessionFactory factory = cfg.buildSessionFactory();
//創建session
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
for (int i = 0; i < 80; i++) {
UserInfo info = new UserInfo();
info.setUserName("test"+i);
info.setUserPass(String.valueOf(Math.random()*1));
session.save(info);
}
transaction.commit();
這裡我給userinfo表中一次性插入了80條記錄。解下來使用hql查詢所有的數據:
String hql = "from UserInfo";
Query query = session.createQuery(hql);
List<UserInfo>lists = query.list();
for (UserInfo userInfo : lists) {
System.out.println(userInfo.getUserName());
}
這裡,查詢所有並沒像sql中有”select *”那樣,而是直接省略了該語句,其實hql和sql是一樣的,只不過一切都是面向對象的查詢,將需要查詢的表名換成對應的實體類名稱,將需要查詢的字段換成對應實體類的屬性,即可。
1.查詢id>10並且id<20的記錄
String hql = "from UserInfo where userId > 10 and userId < 20 ";
//或者
String hql = "from UserInfo where userId between 10 and 20 ";
2.按照userId降序排列
String hql = "from UserInfo order by userId desc";
3.使用參數占位符查詢
String hql = "from UserInfo where userId between ? and ? order by userId desc";
Query query = session.createQuery(hql);
query.setInteger(0, 30);
query.setInteger(1,40);
List<UserInfo>lists = query.list();
4.綁定有意義的參數占位符
String hql = "from UserInfo where userId between :begin and :end order by userId desc";
Query query = session.createQuery(hql);
query.setInteger("begin", 20);
query.setInteger("end",40);
List<UserInfo>lists = query.list();
5.查詢userId值最大的記錄
String hql = "select max(userId) from UserInfo";
Query query = session.createQuery(hql);
List<UserInfo>lists = query.list();
Object result = query.uniqueResult();
System.out.println(result);
可以看到由於這裡只會查詢出一條記錄,所以使用query.uniqueResult();來查詢。
6.hql分頁查詢
查詢從第3條記錄開始,間隔5條記錄
String hql = "from UserInfo";
Query query = session.createQuery(hql);
query.setFirstResult(3);
query.setMaxResults(5);
List<UserInfo>lists = query.list();
7.只查詢某些字段
String hql = "select new com.mydb.entity.UserInfo(userId,userPass) from UserInfo";
Query query = session.createQuery(hql);
List<UserInfo>lists = query.list();
這裡需要注意就是由於這裡使用了兩個參數的構造函數,因此,需要在UserInfo實體類當中添加這兩個參數的構造方法。
或者可以這樣寫:
String hql = "select userId,userPass from UserInfo";
Query query = session.createQuery(hql);
List lists = query.list();
for (Object object : lists) {
Object[]objects = (Object[]) object;
System.out.println(objects[0]+"----++++"+objects[1]);
}
查詢userinfo表中的所有數據
String sql = "select * from userinfo";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity(UserInfo.class);
List<UserInfo> lists = sqlQuery.list();
for (UserInfo userInfo : lists) {
System.out.println(userInfo.getUserName());
}
說明一點:sqlQuery.addEntity(UserInfo.class);是添加hibernate查詢以後從object轉換到的類型。
好了,關於hibernate的查詢,就學習到這裡。