Hibernate Gossip: 基本查詢

使用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,由於Object在Java中是所有類別的父類別,所以下面這個查詢會返回資料庫中所有表格的資料:
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如下設計:
package onlyfun.caterpillar;
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屬性,可以發現它的值是nul,如果試圖使用Session的 saveOrupdate()方法,則會新增一筆資料而不是更新原有的資料。

可以使用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());
}

可以一併參考 Query 的使用。

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9750319131714390&dt=1188782828203&lmt=1175338033&format=160x600_as&output=html&correlator=1188782828203&url=http%3A%2F%2Fcaterpillar.onlyfun.net%2FGossip%2FHibernateGossip%2FSelectHQL.html&ad_type=text_image&ref=http%3A%2F%2Fcaterpillar.onlyfun.net%2FGossip%2FHibernateGossip%2FHibernateGossip.html&cc=29&ga_vid=1129055167.1188554514&ga_sid=1188782641&ga_hid=1111517682&ga_fc=true&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_his=3&u_java=true&u_nplug=17&u_nmime=57" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="allowtransparency">

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-9750319131714390&dt=1188782828296&lmt=1175338033&prev_fmts=160x600_as&format=160x600_as&output=html&correlator=1188782828203&url=http%3A%2F%2Fcaterpillar.onlyfun.net%2FGossip%2FHibernateGossip%2FSelectHQL.html&ad_type=text_image&ref=http%3A%2F%2Fcaterpillar.onlyfun.net%2FGossip%2FHibernateGossip%2FHibernateGossip.html&cc=29&ga_vid=1129055167.1188554514&ga_sid=1188782641&ga_hid=1111517682&ga_fc=true&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_his=3&u_java=true&u_nplug=17&u_nmime=57" frameborder="0" width="160" scrolling="no" height="600" allowtransparency="allowtransparency">
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值