hibernate 5原生sql查询测试学习代码

基本查询

import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.junit.jupiter.api.Test;

import com.fei.domain.Customer;
import com.fei.utils.HibernateUtils;

/**
 * 测试Hibernate中原生sql查询
 */
public class Demo {
	@Test
	// 基本查询
	public void fun1() {
		// 1获得session
		Session session = HibernateUtils.openSession();
		// 2开启事务
		Transaction tx = session.beginTransaction();

		// 3执行操作
		// =====================================
		// 1)书写原生sql语句
		String sql = "select * from cst_customer";
		// 2)创建原生sql查询对象(面向接口编程)
		Query<Customer> query = session.createNativeQuery(sql, Customer.class);

		// 3)获得结果
		List<Customer> list = query.list();
		System.out.println(list);
		// =====================================

		// 4提交事务,关闭资源
		tx.commit();
		session.close();
	}
}

条件查询

	@Test
	// 条件查询
	public void fun2() {
		// 1获得session
		Session session = HibernateUtils.openSession();
		// 2开启事务
		Transaction tx = session.beginTransaction();

		// 3执行操作
		// =====================================
		// 1)书写原生sql语句
		String sql = "select * from cst_customer where cust_id = :id";
		// 2)创建原生sql查询对象
		Query<Customer> query = session.createNativeQuery(sql, Customer.class).setParameter("id", 2l);

		// 3)获得结果
		List<Customer> list = query.list();
		System.out.println(list);
		// =====================================

		// 4提交事务,关闭资源
		tx.commit();
		session.close();
	}

注意:hibernate5在使用原生的sql查询时,占位符要使用:id的形式,使用?的形式会报异常。至少我测试的时候是这样(((φ(◎ロ◎;)φ)))

分页查询

	@Test
	// 分页查询
	public void fun3() {
		// 1获得session
		Session session = HibernateUtils.openSession();
		// 2开启事务
		Transaction tx = session.beginTransaction();

		// 3执行操作
		// =====================================
		// 1)书写原生sql语句
		String sql = "select * from cst_customer limit :beginPos, :maxResult";
		// 2)创建原生sql查询对象
		Query<Customer> query = session.createNativeQuery(sql, Customer.class);

		query.setParameter("beginPos", 0);
		query.setParameter("maxResult", 2);

		// 3)获得结果
		List<Customer> list = query.list();
		System.out.println(list);
		// =====================================

		// 4提交事务,关闭资源
		tx.commit();
		session.close();
	}

查询总记录数

	@Test
	// 查询总记录数
	public void fun4() {
		// 1获得session
		Session session = HibernateUtils.openSession();
		// 2开启事务
		Transaction tx = session.beginTransaction();

		// 3执行操作
		// =====================================
		// 1)书写原生sql语句
		String sql = "select count(*) from cst_customer";
		// 2)创建原生sql查询对象
		Query<?> query = session.createNativeQuery(sql);

		// 3)获得结果
		List<?> list = query.list();
		System.out.println(list.get(0));
                // 这种方式也是可以的,当知道结果只有一条时
                // Object result = query.uniqueResult();
		// =====================================

		// 4提交事务,关闭资源
		tx.commit();
		session.close();
	}

封装的HibernateUtils工具类

package com.fei.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	
	private static SessionFactory sf;

	// 为保证一个应用只有一个SessionFactory对象
	static {
		// 1.创建并读取指定配置文件,空参默认加载src路径下的名为hibernate.cfg.xml
		Configuration conf = new Configuration().configure();
		// 2.根据配置信息,创建SessionFactory对象
		sf = conf.buildSessionFactory();
	}

	// 获得全新session
	public static Session openSession() {
		// 3.获得新的session对象并返回
		return sf.openSession();
	}

	// 获得与线程绑定的session
	public static Session getCurrentSession() {
		// 3.获得与线程绑定的session对象并返回
		return sf.getCurrentSession();
	}
	
}

原文地址:https://www.cnblogs.com/zxfei/p/11125162.html