Hibernate持久层框架使用【六】HQL语句

除了前面直接调用的get等方法查询数据外,还可以通过编写HQL语句来更加灵活的查询数据

例如在数据库中有一张student表,其中有两条数据,如下图

下面使用HQL语句来查询表中的数据

示例代码:

student表:

@Entity(name="student")
public class Student {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int sid;
	
	private String name;
	
	private int age;

	public int getSid() {
		return sid;
	}

	public void setSid(int sid) {
		this.sid = sid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

测试代码:

public class Hql {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MySessionFactory mySessionFactory = new MySessionFactory();
		Session session = mySessionFactory.getSession();
		
		Query query = session.createQuery("select f from student as f");
		List<Student> students = query.list();
		for(Student student : students) {
			System.out.println(student.getName());
		}
		
		mySessionFactory.commit();
		mySessionFactory.close();
	}

}

这里为了方便,使用了前面写的SessionFactory工具类(MySessionFactory,具体参考前面的第一篇或第二篇博客)

代码中使用了Query query = session.createQuery("select f from student as f");这句代码

在createQuery方法中编写Hql语句select f from student as f,这里的f表示所有属性,与Sql语句中的*星号类似,f可以自定义

运行结果显示查询出两条数据的名字

如果需要带查询条件进行查询,可以在后面加入条件,如:

Query query = session.createQuery("select f.name from student as f where f.age=?");
		query.setParameter(0, 20);
		String objs = (String) query.uniqueResult();
		System.out.println(objs);

uniqueResult方法表示唯一结果,若结果为多个,可以用list集合接收数据

setParameter(0, 20)其中0代表?的位置,20代表注入的值

如果需要查询某一个属性,可以这样写

Query query = session.createQuery("select f.name from student as f");
		List<String> names = query.list();
		for(String name : names)
		{
			System.out.println(names);
		}

因为查询出来的结果是String类型的List集合,所以需要用List<String>来接数据

当需要某几个属性时,就要用Object[]类型来接收了,如:

Query query = session.createQuery("select f.name,f.age from student as f");
		List<Object[]> objs = query.list();
		for(Object[] obj : objs)
		{
			System.out.println(obj[0]);
			System.out.println(obj[1]);
		}

除了直接查询需要的某几个属性外,还可以将查询的数据转为特定的格式,如map或list

转为map格式:

Query query = session.createQuery("select new map(f.name as name,f.age as age) from student as f");
		List<Map<Object, Object>> objs = query.list();
		for(Map<Object, Object> obj : objs)
		{
			System.out.println(obj);
		}

Hql语句中的f.name as name表示,以name作为key,f.name作为value,类似于给key作别名

转为list格式:

Query query = session.createQuery("select new list(f.name,f.age) from student as f");
		List<Object> objs = query.list();
		for(Object obj : objs)
		{
			System.out.println(obj);
		}

分页查询:

分页查询是项目中最常用到的需求,如何使用HQL语句实现分页查询,示例代码:

        int index = 2;
		int size = 1;
		Query query = session.createQuery("select f.name from student as f");
		query.setFirstResult((index-1)*size);//起始位置
		query.setMaxResults(size);//最大结果数
		
		List<Object> objs = query.list();
		for(Object obj : objs)
		{
			System.out.println(obj);
		}

index表示当前查询的页码,size表示每一页的数据数量,在分页查询时,只需要修改这两项即可完成分页查询

模糊查询:

//like
		List<Student> students = session.createQuery("select f from student as f where f.name like ?")
				.setParameter(0, "%黄%")
				.list();
		for(Student student : students)
		{
			System.out.println(student.getName());
		}

其他常用函数:

按年龄进行降序排序

Query query = session.createQuery("select f.name from student as f order by f.age desc");
		List<Object> objs = query.list();
		for(Object obj : objs)
		{
			System.out.println(obj);
		}

求和函数

Query query = session.createQuery("select sum(f.age) from student as f");
		Long sum = (Long) query.uniqueResult();
		System.out.println(sum);

统计数量函数

Query query = session.createQuery("select count(f.name) from student as f");
		Long count = (Long) query.uniqueResult();
		System.out.println(count);

求最大值函数

Query query = session.createQuery("select max(f.age) from student as f");
int max = (int) query.uniqueResult();
System.out.println(max);

求最小值函数

Query query = session.createQuery("select min(f.age) from student as f");
int min = (int) query.uniqueResult();
System.out.println(min);

求平均值函数

Query query = session.createQuery("select avg(f.age) from student as f");
Double avg = (Double) query.uniqueResult();
System.out.println(avg);

EJB-QL函数:

求长度函数

//查询name长度为2的数据
		Query query = session.createQuery("select f from student as f where length(f.name) = ?");
		query.setParameter(0, 9);
		List<Student> students = query.list();
		for(Student student : students)
		{
			System.out.println(student.getName());
		}

开方函数

//开方函数
//这里求开方后等于2的数据
List<Student> students = session.createQuery("select f from student as f where sqrt(f.sid) = ?")
	.setParameter(0, 2.0)
	.list();
for(Student student : students)
{
	System.out.println(student.getName());
}

位长函数

//位长函数
		List<Long> longs = session.createQuery("select bit_length(f.name) from student as f")
				.list();
		for(Long lg : longs)
		{
			System.out.println(lg);
		}

ps:一个字节为8位,这里一个字符为3个字节

取模(取余)函数

//这里求age对2取模(取余)后结果为1的数据
		List<Student> students = session.createQuery("select f from student as f where mod(f.age,?) = ?")
				.setParameter(0, 2)
				.setParameter(1, 1)
				.list();
		for(Student student : students)
		{
			System.out.println(student.getAge());
		}

猜你喜欢

转载自blog.csdn.net/weixin_39885435/article/details/83037826