除了前面直接调用的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());
}