这一章讲的是更深入的查询操作,包括各种常用的查询操作。分别用hql语言查询和标准语言查询实现。
- 查询所有
- 条件查询
- 模糊查询
- 排序查询
- 分页查询
- 聚合函数查询
hql语言使用Query接口,使用hql语句,需要导入包
org.hibernate.query.Query
(5.2版本)
标准语言使用Criteria接口,内部提供的方法,需要导入包
import org.hibernate.Criteria
常用的Criteria接口方法如下:
-
public Criteria add(Criterion c)
用于添加限制(条件)。 -
public Criteria addOrder(Order o)
指定排序顺序。 -
public Criteria setFirstResult(int firstResult)
指定要检索的第一个记录数。 -
public Criteria setMaxResult(int totalResult)
指定要检索的记录总数。 -
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类提供投影查询与聚合函数查询。常用方法如下:
-
public static CountProjection count(String propertyName);
按照属性计数 -
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 query = session.createQuery("from LinkMan");
List list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
- 使用标准语言查询,调用方法实现
@Test
public void criteriaAll() {
Session session = null;
Transaction tx = null;
try {
session = HbmUtil.getSession();
tx = session.beginTransaction();
Criteria criteria = session.createCriteria(LinkMan.class);
List 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 query = session.createQuery("from LinkMan where name = ?");
// query.setParameter(0, "name");
Query query = session.createQuery("from LinkMan where name = :n");
query.setParameter("n", "name");
List 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 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 query = session.createQuery("from LinkMan where name like ?");
query.setParameter(0, "%哈%");
List 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 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 query = session.createQuery("from LinkMan order by lid desc");
List 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 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 query = session.createQuery("from LinkMan order by lid desc");
query.setFirstResult(0); // 分页开始行数
query.setMaxResults(5); // 规定每页最大条数
List 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 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 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 strings = criteria.list();
for (String string : strings) {
System.out.println(string);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
聚合函数查询
- 使用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();
/**
* 平均数:avg()
* 最小值:min()
* 最大值:max()
* 总数:sum()
* 计数: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();
/**
* 平均数:avg()
* 最小值:min()
* 最大值:max()
* 总数:sum()
* 计数:count()
*/
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.setProjection(Projections.count("lid")); // Integer类型
criteria.setProjection(Projections.rowCount()); // 统计查询
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();
}
}
根据hibernate思想,一切数据库操作都映射为对实体类的操作。所以在写hql语句或者标准查询中属性时都要使用实体类中属性名。在标准查询中这是必须的,hql语言中也可以使用数据库中的字段,建议全部使用实体类属性名。
在标准查询中还提供了离线查询的模式,代码如下。
@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 list = criteria.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
session.close();
}
}
就是构建criteria的方式不一样,还有比直接创建有些好处。具体哪些,暂时不太明白。我发现的一点就是,如果你使用的hibernate版本是5.2的使用createCriteria创建criteria已经被废弃了,而离线模式是没有的。既然被保留下来就有它的优越之处,以后慢慢发掘。
在官网查看了下其实Query接口也快要被废弃了、、、呃,是不是白学了。。。要不然还是老老实实用用dbutils吧~~
hibernate的一些基础用法算是学完了,在深入的知识今后慢慢在研究吧。先记录下我算是掌握的东西。