作為老牌的 ORM 框架,Hibernate 在推動資料庫持久化層所做出的貢獻有目共睹。 它所提供的數據查詢方式也越來越豐富,從 SQL 到自創的 HQL,再到面向對象的標準化查詢。 雖然查詢方式有點眼花繚亂,配置使用起來也稍微有點複雜。 但是絲毫掩蓋不了它迷人的地方,本篇博客試著彙總 Hibern ...
作為老牌的 ORM 框架,Hibernate 在推動資料庫持久化層所做出的貢獻有目共睹。
它所提供的數據查詢方式也越來越豐富,從 SQL 到自創的 HQL,再到面向對象的標準化查詢。
雖然查詢方式有點眼花繚亂,配置使用起來也稍微有點複雜。
但是絲毫掩蓋不了它迷人的地方,本篇博客試著彙總 Hibernate 所有的查詢方式。
蘿蔔青菜各有所愛,工作中可以根據自己的喜好選擇其中的幾種進行編程。
1. HQL 方式,參數使用問號占位(4.1 版本中已被廢棄)
public List<UserPO> getUserList(UserPO userPO) {
String hql = "from UserPO where name = ? and passwd= ?";
Query query = getHibernateSession().createQuery(hql);
query.setParameter(0, userPO.getName());
query.setParameter(1, userPO.getPasswd());
return query.list();
}
2. HQL 方式,參數使用命名占位
public List<UserPO> getUserList(UserPO userPO) {
String hql = "from UserPO where name = :userName and passwd= :userPwd";
Query query = getHibernateSession().createQuery(hql);
query.setParameter("userName", userPO.getName());
query.setParameter("userPwd", userPO.getPasswd());
return query.list();
}
3. HQL 方式,參數使用 JPA 占位符
public List<UserPO> getUserList(UserPO userPO) {
String hql = "from UserPO where name = ?1 and passwd= ?2";
Query query = getHibernateSession().createQuery(hql);
query.setParameter("1", userPO.getName());
query.setParameter("2", userPO.getPasswd());
return query.list();
}
4. HQL 方式,參數使用對象綁定
public List<UserPO> getUserList(UserPO userPO) {
String hql = "from UserPO where name = :name and passwd= :passwd";
Query query = getHibernateSession().createQuery(hql);
query.setProperties(userPO);
return query.list();
}
PS:需要註意的是命名參數占位要與PO屬性一致,而且只能使用參數命名占位的方式。
當然上述的 1--4 填充查詢方式,HQL 都可以調整為SQL,是相通的。
5. QBC(Query By Criteria) 方式,參數使用 Restrictions 對象
public List<UserPO> getUserList(UserPO userPO) {
Criteria criteria = getHibernateSession().createCriteria(UserPO.class);
criteria.add(Restrictions.eq("name",userPO.getName()));
criteria.add(Restrictions.eq("passwd",userPO.getPasswd()));
return criteria.list();
}
6. QBC(Query By Criteria) 方式,參數使用對象綁定
public List<UserPO> getUserList(UserPO userPO) {
Criteria criteria = getHibernateSession().createCriteria(UserPO.class);
criteria.add(Example.create(userPO));
return criteria.list();
}
PS: QBC(Query By Criteria) 方式,使用到的關鍵抽象對象有:
Restrictions --> 設置查詢限制條件
Order --> 設置查詢排序條件
Projections --> 工具類的方法進行統計和分組。
上述 5-6 也是我最喜歡的方式,用面向對象查詢方式來迎合面向對象的編程。
7. 離線條件查詢
public List<UserPO> getUserList(UserPO userPO) {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(UserPO.class);
detachedCriteria.add(Restrictions.eq("name",userPO.getName()));
detachedCriteria.add(Restrictions.eq("passwd",userPO.getPasswd()));
Criteria criteria = detachedCriteria.getExecutableCriteria(getHibernateSession());
return criteria.list();
}
離線查詢的好處,可以將查詢對象 DetachedCriteria 作為參數傳遞到 DAO層,減少 DAO 層代碼
8. QBC(Query By Criteria) 方式,分頁查詢
public List<UserPO> getUserList(UserPO userPO) {
Criteria criteria = getSession().createCriteria(UserPO.class);
criteria.setFirstResult(4);
criteria.setMaxResults(3);
return criteria.list();
}
}
PS: 分頁查詢主要是要指定兩個參數(從什麼開始,取多少條):
Query或者Criteria對象的 setFirstResult()和setMaxResults()
當然8中的 Criteria 對象也可以換為 Query 對象,使用 HQL 或者 SQL 查詢方式。