這一章講的是更深入的查詢操作炮沐,包括各種常用的查詢操作。分別用hql語言查詢和標準語言查詢實現(xiàn)。
- 查詢所有
- 條件查詢
- 模糊查詢
- 排序查詢
- 分頁查詢
- 聚合函數(shù)查詢
hql語言使用Query接口兴猩,使用hql語句饲梭,需要導入包
org.hibernate.query.Query
(5.2版本)
標準語言使用Criteria接口乘盖,內(nèi)部提供的方法,需要導入包
import org.hibernate.Criteria
常用的Criteria接口方法如下:
-
public Criteria add(Criterion c)
用于添加限制(條件)憔涉。 -
public Criteria addOrder(Order o)
指定排序順序订框。 -
public Criteria setFirstResult(int firstResult)
指定要檢索的第一個記錄數(shù)。 -
public Criteria setMaxResult(int totalResult)
指定要檢索的記錄總數(shù)兜叨。 -
public List list()
返回包含對象的列表穿扳。 -
public Criteria setProjection(Projection projection)
指定投影衩侥。
Restrictions類提供可用作標準的方法。常用的Restrictions類方法如下:
-
public static SimpleExpression lt(String propertyName,Object value)
設置屬性小于約束 -
public static SimpleExpression le(String propertyName,Object value)
設置屬性小于或等于約束矛物。 -
public static SimpleExpression gt(String propertyName,Object value)
設置屬性大于約束茫死。 -
public static SimpleExpression ge(String propertyName,Object value)
設置屬性大于或等于約束。 -
public static SimpleExpression eq(String propertyName,Object value)
設置屬性與約束相等履羞。 -
public static Criterion between(String propertyName, Object low, Object high)
設置屬性在兩個約束之間峦萎。 -
public static SimpleExpression like(String propertyName, Object value)
將類似的約束設置為給定的屬性。
Order類代表排序順序忆首。常用的 Restrictions 類方法如下:
-
public static Order asc(String propertyName)
按指定屬性進行升序排列爱榔。 -
public static Order desc(String propertyName)
按指定屬性進行降序排列。
Projections類提供投影查詢與聚合函數(shù)查詢糙及。常用方法如下:
-
public static CountProjection count(String propertyName);
按照屬性計數(shù) -
public static AggregateProjection max(String propertyName);
獲取某個屬性的最大值 -
public static AggregateProjection min(String propertyName);
獲取某個屬性的最小值 -
public static AggregateProjection avg(String propertyName);
獲取某個屬性的平均值 -
public static AggregateProjection sum(String propertyName);
獲取某個屬性的總和 -
public static PropertyProjection Projections.property(String propertyName);
按照屬性進行投影查詢
查詢所有
這個在第二章中就用過详幽,這里在寫一次
- 使用hql語言查詢,hql語句
from LinkMan
LinkMan是實體類
@Test
public void queryAll() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Query<LinkMan> query = session.createQuery("from LinkMan");
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
- 使用標準語言查詢丁鹉,調用方法實現(xiàn)
@Test
public void criteriaAll() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(LinkMan.class);
List<LinkMan> linkMans = criteria.list();
for (LinkMan linkMan : linkMans) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
條件查詢
- 使用hql語言查詢
- hql語句
from LinkMan where name = ?
妒潭,調用方法org.hibernate.query.Query.setParameter(int arg0, Object arg1)
為問號賦值,下標從0開始揣钦,這和jdbc略有不同雳灾。 - 也可以使用
from LinkMan where name = :n
語句,調用org.hibernate.query.Query.setParameter(String arg0, Object arg1)
方法進行賦值冯凹。
@Test
public void queryTiaojian() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
// Query<LinkMan> query = session.createQuery("from LinkMan where name = ?");
// query.setParameter(0, "name");
Query<LinkMan> query = session.createQuery("from LinkMan where name = :n");
query.setParameter("n", "name");
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
- 使用標準語言查詢
public void criteriaTiojian() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(LinkMan.class);\
criteria.add(Restrictions.eq("name", "name"));
List<LinkMan> linkMans = criteria.list();
for (LinkMan linkMan : linkMans) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
模糊查詢
- 使用hql語言查詢谎亩,hql語句
from LinkMan where name like ?
@Test
public void queryMohu() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Query<LinkMan> query = session.createQuery("from LinkMan where name like ?");
query.setParameter(0, "%哈%");
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
- 使用標準語言查詢
@Test
public void criteriaMohu() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.add(Restrictions.like("name", "%哈%"));
List<LinkMan> linkMans = criteria.list();
for (LinkMan linkMan : linkMans) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
排序查詢
- 使用hql語言查詢蔗候,hql語句
from LinkMan order by lid desc
@Test
public void queryPaixu() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Query<LinkMan> query = session.createQuery("from LinkMan order by lid desc");
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
- 標準語言查詢
@Test
public void criteriaPaixu() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.addOrder(Order.desc("lid"));
List<LinkMan> linkMans = criteria.list();
for (LinkMan linkMan : linkMans) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
分頁查詢
- 使用hql語言查詢
@Test
public void queryPage() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
// 倒序分頁
Query<LinkMan> query = session.createQuery("from LinkMan order by lid desc");
query.setFirstResult(0); // 分頁開始行數(shù)
query.setMaxResults(5); // 規(guī)定每頁最大條數(shù)
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
- 使用標準查詢
@Test
public void criteriaPages() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.addOrder(Order.desc("lid"));
criteria.setFirstResult(0);
criteria.setMaxResults(5);
List<LinkMan> linkMans = criteria.list();
for (LinkMan linkMan : linkMans) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
投影查詢
- 使用hql語言查詢有决,hql語句
select name from LinkMan
@Test
public void queryTouyin() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Query query = session.createQuery("select name from LinkMan");
List<String> list = query.list();
for (String string : list) {
System.out.println(string);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
- 使用標準語言查詢
@Test
public void criteriaTouyin() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.setProjection(Projections.property("name"));
List<String> strings = criteria.list();
for (String string : strings) {
System.out.println(string);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
聚合函數(shù)查詢
- 使用hql語言查詢,hql語句和sql類似
select count(lid) from LinkMan
@Test
public void queryFun() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
/**
* 平均數(shù):avg()
* 最小值:min()
* 最大值:max()
* 總數(shù):sum()
* 計數(shù):count()
*/
Query query = session.createQuery("select count(lid) from LinkMan");
int count = Integer.parseInt(query.uniqueResult().toString());
System.out.println(count);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
- 使用標準語言查詢
@Test
public void criteriaFun() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
/**
* 平均數(shù):avg()
* 最小值:min()
* 最大值:max()
* 總數(shù):sum()
* 計數(shù):count()
*/
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.setProjection(Projections.count("lid")); // Integer類型
criteria.setProjection(Projections.rowCount()); // 統(tǒng)計查詢
criteria.setProjection(Projections.max("lid"));
criteria.setProjection(Projections.min("lid"));
criteria.setProjection(Projections.sum("lid"));
criteria.setProjection(Projections.avg("lid")); //Float類型
float avg = Float.parseFloat(criteria.uniqueResult().toString());
System.out.println(avg);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
根據(jù)hibernate思想甜攀,一切數(shù)據(jù)庫操作都映射為對實體類的操作浑劳。所以在寫hql語句或者標準查詢中屬性時都要使用實體類中屬性名阱持。在標準查詢中這是必須的,hql語言中也可以使用數(shù)據(jù)庫中的字段魔熏,建議全部使用實體類屬性名衷咽。
在標準查詢中還提供了離線查詢的模式,代碼如下蒜绽。
@SuppressWarnings("unchecked")
@Test
public void criteriaDetached() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(LinkMan.class);
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<LinkMan> list = criteria.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
就是構建criteria的方式不一樣镶骗,還有比直接創(chuàng)建有些好處。具體哪些躲雅,暫時不太明白鼎姊。我發(fā)現(xiàn)的一點就是,如果你使用的hibernate版本是5.2的使用createCriteria創(chuàng)建criteria已經(jīng)被廢棄了,而離線模式是沒有的相寇。既然被保留下來就有它的優(yōu)越之處慰于,以后慢慢發(fā)掘。
在官網(wǎng)查看了下其實Query接口也快要被廢棄了唤衫、东囚、、呃战授,是不是白學了。桨嫁。植兰。要不然還是老老實實用用dbutils吧~~
hibernate的一些基礎用法算是學完了,在深入的知識今后慢慢在研究吧璃吧。先記錄下我算是掌握的東西楣导。