以下Hibernate查询是我在上学那会总结的,时隔多年,但用法依旧,长时间不用偶尔楼上一眼代码也是信手拈来
HQL查询
实体查询 && 属性查询
SessionFactory = null;
Session = null;
try {
    sessionFactory = new Configuration().configure().buildSessionFactory();
    session = sessionFactory.openSession();
    Query = session.createQuery("from App_User");  // session.createQuery("from App_User as a where name = 'admin' ");
//  session.createQuery("select username from App_User ")  // 属性查询
    List<App_User> list = query.list();
} catch (Exception e) {
    e.printStackTrace();
}参数绑定
? 占位符
session = sessionFactory.openSession();
// Query = session.createQuery("select userName   from App_User where userName = ? ");
Query query = session.createQuery("from App_User where userName = ? ");
query.setString(0, "xiaokui");
List<App_User> list = query.list();: 命名参数
session = sessionFactory.openSession();
Query query = session.createQuery("from App_User where userName = :name ");
query.setString("name", "xiaokui");  // 这里不能使用 占位符索引方式
List<App_User> list = query.list();封装参数
第一步:先定义一个普通查询类
public class QueryUser {
         private String name;
         private int age;
         private String address;
// 省略getter和setter方法
}
第二步:封装参数
QueryUser qu = new QueryUser();
qu.setName("xiaokui");
qu.setAge(20);
第三步:查询
session = sessionFactory.openSession();
Query = session.createQuery("from App_User where (username like :name) and (age = :age)");
query.setProperties(qu);
List<App_User> list = query.list();分页
(1) 根据结果获得记录数
 除了Hibernate中   int count = list.size() ,还有以下方式获取总记录数
ScrollableResults sr = query.scroll();
sr.last();
if (sr.getRowNumber() >= 0) {
    this.totalResults =   sr.getRowNumber() + 1;
}else {
    this.totalResults = 0;
}(2) 计算总页数
int totalPages (count%pageSize == 0) ? (count/pageSize) :(count/pageSize + 1);
(3) 实现分页
query.setFirstResult((pageIndex - 1) * pageSize); // 第一条记录的位置 query.setMaxResults(pageSize); // 返回的最大记录条数 List<App_User> list = query.list();
子查询
session.createQuery("select * from App_User where roleid = (select roleid from role roleid = 1)");连接查询
内联接 inner join 或 join
迫切内联接 inner join fetch 或 join fetch
左外联接 left outer join 或 left join
迫切左外联接 left outer join fetch 或 left join fetch
左外联接 right outer join 或 right join
Form Entity inner join [fetch] Entity.property
session.createQuery("from App_User u inner join fetch roleid r");命名查询
<hibernate-mapping package="cn.wingfly.bean">
    <class catalog="money_note"   name="App_User" table="app_user">
       <id name="uuid" type="java.lang.Integer">
           <column name="uuid" />
           <generator class="increment" />
       </id>
       ...
    </class>
 
    <query name="loginUser">
    <![CDATA[
       from   User u where u.name = :name and u.password = :password;
    ]]>
    </query>
</hibernate-mapping>
 
Query query = session.getNamedQuery("loginUser");
query.setString("name", "xiaokui");
query.setString("password", "0123456");
List<App_User>   list = query.list();分组、统计、排序,直接在sql语句中操作
例如:select sum(price) from house group by id having sum(price) > 1000
Criteria查询
查询所有
sessionFactory = new Configuration().configure().buildSessionFactory(); session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(App_User.class); List<App_User> list =criteria.list();
查询条件
| 序号 | 方法 | 说明 | 
| 1 | Restrictions.eq() | = | 
| 2 | Restrictions.allEq() | 使用Map 使用key/value等进行多个相等值对比 | 
| 3 | Restrictions.gt() | > | 
| 4 | Restrictions.ge() | >= | 
| 5 | Restrictions.lt() | < | 
| 6 | Restrictions.le() | <= | 
| 7 | Restrictions.between() | between子句 | 
| 8 | Restrictions.like() | like | 
| 9 | Restrictions.in() | In | 
| 10 | Restrictions.add() | add | 
| 11 | Restrictions.or() | or | 
| 12 | Restrictions.not() | not | 
Criteria criteria = session.createCriteria(App_User.class);
criteria.add(Restrictions.eq("userName", "xiaokui"));   // 查询用户名为xiaokui的数据
List<App_User>   list =criteria.list();使用Example查询
sessionFactory = new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
Criteria criteria =  session.createCriteria(App_User.class);
App_User user = new App_User();
user.setUserName("xiaokui");
user.setPassWord("0123456");
criteria.add(Example.create(user));
List<App_User> list =criteria.list();查询排序
session = sessionFactory.openSession();
Criteria criteria = session.createCriteria(App_User.class);
criteria.addOrder(Order.desc("id"));
// criteria.addOrder(Order.asc("id"));
List<App_User>   list =criteria.list();分页
session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(App_User.class); criteria.setFirstResult(10); // 从第10条开始,最大显示8条数据 criteria.setMaxResults(8); List<App_User> list =criteria.list();
统计查询
通过 ProjectionList 和 Projections 查询统计
| 序号 | 方法 | 说明 | 
| 1 | Projections.avg() | avg 函数 | 
| 2 | Projections.count() | count 函数 | 
| 3 | Projections.max() | max 函数 | 
| 4 | Projections.min() | min 函数 | 
| 5 | Projections.sum() | sum函数 | 
session = sessionFactory.openSession();
Criteria criteria = session.createCriteria(App_User.class);
ProjectionList pl = Projections.projectionList();
pl.add(Projections.groupProperty("roleid"));  // 分组
pl.add(Projections.rowCount());
criteria.setProjection(pl);
List<App_User> list =criteria.list(); 
未经允许请勿转载:程序喵 » Hibernate查询方式总结
 程序喵
程序喵