入門 05 - 基本資料查詢

转载 2006年05月20日 00:35:00
使用Hibernate進行資料查詢是一件簡單的事,Java程式設計人員可以使用物件操作的方式來進行資料查詢,查詢時使用一種類似SQL的HQL(Hibernate Query Language)來設定查詢的條件,與SQL不同的是,HQL是具備物件導向的繼承、多型等特性的語言。

 直接使用範例來看看如何使用Hibernate進行資料庫查詢,在這之前,請先照之前介紹過的主題在資料庫中新增幾筆資料:
在Hibernate中新增資料

 查詢資料時,我們所使用的是Session的find()方法,並在當中指定HQL設定查詢條件,查詢的結果會裝載在List物件中傳回,您所需要的是將它們一一取出,一個最簡單的例子如下:

HibernateTest.java
import onlyfun.caterpillar.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;

public class HibernateTest {
    public static void main(String[] args) throws HibernateException {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
     
        List users = session.find("from User");

        session.close();
        sessionFactory.close();

        for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user = (User) iterator.next();
            System.out.println(user.getName() +
                               "/n/tAge: " + user.getAge() +
                               "/n/tSex: " + user.getSex());
        }
    }
}

 find()中的"from User"即HQL,User指的是User類別,藉由映射文件,它將會查詢USER表格中的資料,相當於SQL中的SELECT * FROM USER,實際上我們的User類別是位於onlyfun.caterpillar下,Hibernate會自動看看import中的package名稱與類別名稱是否符合,您也可以直接指定package名稱,例如:

session.find("from onlyfun.caterpillar.User");

 這個程式的運行結果可能是這樣的:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_
caterpillar
   Age: 28
   Sex: M
momor
   Age: 25
   Sex: F
Bush
   Age: 25
   Sex: M
Becky
   Age: 35
   Sex: F

 上面所介紹的查詢是最簡單的,只是從資料表中查詢所有的資料,Hibernate所查詢得回的資料,是以物件的方式傳回,以符合程式中操作的需要,我們也可以限定一些查詢條件,並只傳回我們指定的欄位,例如:

List names = session.find("select user.name from User as user where age = 25");
for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {
    String name = (String) iterator.next();
    System.out.println("name: " + name);
}

 在find()中的HQL示範了條件限定的查詢,User as user為User類別取了別名,所以我們就可以使用user.name來指定表格傳回欄位,where相當於SQL中的WHERE子句,我們限定查詢 age等於25的資料,這次查詢的資料只有一個欄位,而型態是String,所以傳回的List內容都是String物件,一個運行的例子如下:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.name as x0_0_ from USER user0_ where (age=25 )
name: momor
name: Bush

 如果要傳回兩個以上的欄位,也不是什麼問題,直接來看個例子:

List results = session.find("select user.name, user.age from User as user where sex = 'F'");
for (ListIterator iterator = results.listIterator(); iterator.hasNext(); ) {
    Object[] rows = (Object[]) iterator.next();
    String name = (String) rows[0];
    Integer age = (Integer) rows[1];
    System.out.println("name: " + name + "/n/t" + age);
}

 從上面的程式中不難看出,傳回兩個以上欄位時,每一次ListIterator會以Object陣列的方式傳回一筆資料,我們只要指定陣列索引,並轉換為適當的型態,即可取得資料,一個查詢的結果如下:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.name as x0_0_, user0_.age as x1_0_ from USER user0_ where (sex='F' )
name: momor
   25
name: Becky
   35

 您也可以在HQL中使用一些函數來進行結果統計,例如:

List results = session.find("select count(*), avg(user.age) from User as user");
ListIterator iterator = results.listIterator();
Object[] rows = (Object[]) iterator.next();
System.out.println("資料筆數: " + rows[0] + "/n平均年齡: " + rows[1]);

 一個查詢的結果如下所示:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select count(*) as x0_0_, avg(user0_.age) as x1_0_ from USER user0_
資料筆數: 4
平均年齡: 28.25

 這邊我們先介紹的是一些簡單的查詢動作,將來有機會的話,再介紹一些進階的查詢,如果您有想要先認識一些HQL,可以看看參考手冊的第11章,當中對於HQL有詳細的說明。

SQL Server入門之數據類型及基本查詢語句

数据类型是数据的一种属性,表示数据所表示信息的类型。任何一种计算机语言都定义了自己的数据类型。当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多或少有些不同。SQLServer提...
  • ymtianyu
  • ymtianyu
  • 2013年05月17日 16:29
  • 632

一个简单额Python MVC框架(3)

MVC中的M已经介绍完了,C和V都是用户代码,先看几个工具类:A)全局变量类,用户定义全局变量和一个用于产生普通对象的类型:gl_A=1 gl_B='a' class Obj: def __i...
  • hawksoft
  • hawksoft
  • 2015年03月28日 16:54
  • 1761

百度面试题:求一个已排序的数组中绝对值最小的元素

题目为: 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-...
  • longshengguoji
  • longshengguoji
  • 2013年01月29日 22:57
  • 4606

Java初学者入门指南

跟其他语言相比,大家或许会觉得Java很难,因为Java一开始给人的感觉就不是平易近人和蔼可亲的,甚至对于从未接触过Java的人而言,Java是非常难上手的。其实,完全是一种偏见,Java的入手,可以...
  • u010619705
  • u010619705
  • 2013年05月29日 11:45
  • 484

特定日期查詢

--a. 一个月的第一天 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --b. 本周的星期一 SELECT DATEADD(wk, DATED...
  • tearsmo
  • tearsmo
  • 2015年08月17日 16:09
  • 1097

PL/SQL基础语法入门

先前安装了PL/SQL软件 PL/SQL全称为Procedural Language/SQL。 PL/SQL也是一种程序语言,叫做过程化SQL语言,是Oracle数据库对SQL语句...
  • chance2015
  • chance2015
  • 2015年12月26日 18:20
  • 2264

Mybatis入門實例

一 工程目錄結構
  • jungle0127
  • jungle0127
  • 2014年05月18日 00:43
  • 368

mysql乱码问题完美解决篇(我用的perl其他语言类推可解)

最近在做sqlserver到mysql的数据迁移 无可避免的遇到了乱码问题  看了N多资料之后  终于解决了问题   并且对mysql的乱码问题解决找到了一个完整的套路 这里分享给大家,希望也能帮到你...
  • q383965374
  • q383965374
  • 2013年10月30日 18:53
  • 3610

ms sql 获取字符串首字母

很久没有编写新文章,现在发布一篇自定义函数,针对于ms sql数据库中需要获取字符串首字母,对于需要的朋友希望对你有用,如果你有更好的方法也可以给我留言。...
  • zhengdjin
  • zhengdjin
  • 2013年11月18日 21:22
  • 1561

Mybatis入門筆記

Mybatis入門筆記Mybatis入門筆記 了解Mybatis持久层框架 Mybatis的jar包下载 日志文件的配置 Mybatis的工作流程了解Mybatis——持久层框架首先了解ibatis ...
  • kidmiddle
  • kidmiddle
  • 2016年11月01日 17:36
  • 166
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:入門 05 - 基本資料查詢
举报原因:
原因补充:

(最多只允许输入30个字)