1、单行查询
get/load,这里不再赘述
2、SQL查询
方式一:SQLQuery query = session.createSQLQuery("sql语句")
这种方式查询出来的的结果一律是List<Object[]>类型
方式二:通过这种方式可以获取conn,然后再跟jdbc一样了
session.doWork(new Work() {
@Override
public void execute(Connection conn) throws SQLException {
System.out.println(conn.getClass().getName());
}
});
3、 HQL查询
通过Query query = session.createQuery("hibernate查询语句")
值的注意的是,这种方式查询到的结果,如果hibernate语句查询的是表的所有字段,那么查询的记录会自动封装到对应的对象当中,也就是会返回List<User>这种类型。此外的话也会返回 List<Object[]> 类型。但如果就想要查询出来封装到对象中呢?有办法,比如hql语句是是:select id,username from User,那么此时我们可以先在User类中定义好这么个构造方法(当然要记得把无参的构造方法补上,否则被覆盖了)如下:
public User() {
}
public User(int id, String username) {
super();
this.id = id;
this.username = username;
}
然后就可以这么写:
@Test
public void hqlTest2() {
Session session = SessionFactoryUtils.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Query query = session.createQuery("select new User(id,username) from User");//这是重点--投影查询
List<User> list = query.list();//这里查询出来就是User对象了
for(User u : list) {
System.out.println(u);
}
tx.commit();
}
4、QBC
QBC也就是query by criteria,它能实现的和hql语句一样,不同在于它更加面向对象,但是同时因为封装的太厉害,性能也比不上hql,可它有一点前面两种方式办不到,试想,servlet层需要传十个参数过来,那会是多么麻烦,并且万一以后代码要改,则三层全都要改,而如果在servlet层就使用criteria进行封装查询条件,直接往后传,那么这个问题迎刃而解。但又有一个问题,如果在servlet层就用criteria的话就需要创建session了,session不应该出现在这一层,于是离线查询也叫动态查询出来了(DetachedCriteria),参见下面代码(当参数很多的时候用离线,否则直接用criteria就好了,没必要用离线):
//离线查询模拟
//servlet
@Test
public void criteriaTest() {
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
dc.add(Restrictions.eq("password","123456"));
List list = criteriaTest1(dc);
for(Object o : list) {
System.out.println(o);
}
}
//serviece
private List criteriaTest1(DetachedCriteria dc) {
List list = null;
Session session = SessionFactoryUtils.getSessionFactory().getCurrentSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
list = criteriaTest2(dc);;
tx.commit();
} catch (Exception e) {
tx.rollback();
}
return list;
}
//dao
private List criteriaTest2(DetachedCriteria dc) {
Session session = SessionFactoryUtils.getSessionFactory().getCurrentSession();
Criteria c = dc.getExecutableCriteria(session);
return c.list();
}
关于criteria详细用法参见此处:
https://www.cnblogs.com/deng-cc/p/6428599.html