HQL基本语句

来源:互联网 发布:程序员写博客的网站 编辑:程序博客网 时间:2024/04/29 09:43

HQL基本查询

        查询指定类对应表格的所有记录

        例如:

Session session = sessionFactory.openSession();

Query query = session.createQuery("from User"); 

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

User user = (User) iterator.next();   

System.out.println(user.getId()+"/t"+user.getAge()+"/t"+ user.getName());

}

        也可以指定类的全名

        例如:

Query query = session.createQuery("from onlyfun.caterpillar.User");

        HQL本身不区分大小写,不过要注意类的名称必须区分大小写。

        在查询类对应的表格时,需注意到继承的问题,Hibernate会自动判定继承关系,如果查询的类是某类的父类,则会返回与父类、子类对应的所有表格记录,

        例如如果查询java.lang.Object,由于ObjectJava中是所有类的父类别,所以下面这个查询会返回数据库中所有表格的记录:

Query query = session.createQuery("from java.lang.Object");

        针对某个属性作查询

        例子如下:

Session session = sessionFactory.openSession();

Query query = session.createQuery("select user.name from User as user"); 

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

       System.out.println(iterator.next());

}

        查询两个以上的属性,查询的结果会以数组的方式返回

        例子如下:

Session session = sessionFactory.openSession();

Query query = session.createQuery("select user.age, user.name from User as user"); 

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

Object[] obj = (Object[]) iterator.next();  

System.out.println(obj[0] + "/t" + obj[1]);

}

        如果User类提供有适当的构建方法,则可以在使用HQL时直接指定新建一个对象传回

        例如若User如下设计:

public class User {   

private Integer id;   

private String name;   

private Integer age;       

public User() {   }       

public User(String name, Integer age) {       

this.name = name;        

this.age = age;   

   

....}

        则在使用HQL查询时可以如下:

Session session = sessionFactory.openSession();

Query query = session.createQuery("select new User(user.name, user.age) from User as user"); 

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

User user= (User) iterator.next();  

      System.out.println(user.getAge() + "/t" + user.getName());

}

        注意,这个返回的User实例并未与数据库有任何关联,可以试着取得id属性,可以发现它的值是null,如果试图使用SessionsaveOrupdate()方法,则会新增一条记录而不是更新原有的记录。

        使用distinct去除资料重复的记录

        例子:

Query query = session.createQuery("select distinct user.age from User as user");

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

       System.out.println(iterator.next());

}

        HQL中使用函数

        例如取得记录集的大小:

Query query = session.createQuery("select count(*) from User as user"); 

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

    System.out.println(iterator.next());

}

        使用avg()取得属性的平均值:

Query query = session.createQuery("select avg(user.age) from User as user"); 

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

    System.out.println(iterator.next());

}

        使用upper()函数将字符串转为大写:

Query query = session.createQuery("select upper(user.name) from User as user"); 

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

    System.out.println(iterator.next());

}

where子句

        可以使用where子句来限定查询的条件,除了 = 运算之外,还有 >>=<<=!= <>等比较运算

        例如:

Session session = sessionFactory.openSession();

Query query = session.createQuery("from User user where user.name='caterpillar'"); 

List names = query.list();

Iterator iterator =  names.iterator();

while(iterator.hasNext()) {   

User user = (User) iterator.next();   

System.out.println(user.getAge() + "/t" + user.getName());

}

        where子句上进行表达式

        例如:

Query query = session.createQuery("from User user where (user.age / 10 = 3)");

        where子句上使用andor

        例如:Query query = session.createQuery("from User user where (user.age > 20) and (user.name = 'caterpillar')");

        is not nullLis null则可以测试字段值是否为空值

        例如: Query query = session.createQuery("from User user where user.name is not null");

        between可以测试字段值是否在指定的范围之内

        例如: Query query = session.createQuery("from User user where user.age between 20 and 30");

        使用innot in来测试字段值是否在您指定的集合中

        例如: Query query = session.createQuery("from User user where user.name in('caterpillar', 'momor')");

        likenot like可以让您进行模糊条件搜寻

        例如想搜寻名称中含有cater开头的资料:Query query = session.createQuery("from User user where user.name like 'cater%'");

order by子句

        对查询结果使用order by进行排序

        例子:Query query = session.createQuery("from User user order by user.age");

        可使用desc反排序

        例子:Query query = session.createQuery("from User user order by user.age desc");

        同时指定两个以上的排序方式

        例如先按照"age"反序排列,如果"age"相同,则按照"name"顺序排列:Query query = session.createQuery("from User user order by user.age desc, user.name");

group by子句

        使用GROUP BY子句,自动将指定的字段依相同的内容群组

        例如依字段"sex"分组并作平均:Query query = session.createQuery("select user.sex, avg(user.age) from User user group by user.sex");

        执行的结果如下:

+-------------------------------+

|    sex       |    avg(age)    |

+-------------------------------+

|    male      |    30          |

+-------------------------------+

|    female    |    25          |

+-------------------------------+

        结合having子句

        例如只将平均大于20的记录分组显示出来:Query query = session.createQuery("select user.sex, avg(user.age) from User user group by user.sex having avg(user.age) > 20");

使用HQL更新和删除记录

        Hibernate 2时,HQL只用于查询资料,要更新或删除资料,则是依赖于Sessionupdate()saveOrUpdate()delete()等方法

        Hibernate 3中,HQL新增了updatedelete语句,可以直接使用HQL指定更新或删除

        例如使用update子句进行更新:

Session session = sessionFactory.openSession();

Transaction tx= session.beginTransaction();

Query query = session.createQuery("update User set name='momor' where name='bbb'");

query.executeUpdate();

tx.commit();

session.close();

        使用delete子句进行资料删除

        例子:

Session session = sessionFactory.openSession();

Transaction tx= session.beginTransaction();

Query query = session.createQuery("delete User where name='bush'");

query.executeUpdate();

tx.commit();

session.close();

        进行资料添加

        例子:

            Session session = sessionFactory.openSession();

Transaction tx= session.beginTransaction();

session.save (User);

tx.commit();

session.close();

原创粉丝点击