hibenate中几种查询方式

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值