作為老牌的 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 查詢方式。