Hibernate用法:查询,更新,删除!(1)

发表于:2007-06-11来源:作者:点击数: 标签:
一、基本数据查询 使用Hibernate进行数据查询是一件简单的事, Java 程序设计人员可以使用对象操作的方式来进行数据查询,查询时使用一种类似 SQL 的HQL(Hibernate Query Language)来设定查询的条件,与SQL不同的是,HQL是具备对象导向的继承、多型等特性

一、基本数据查询

使用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


共3页: 1 [2] [3] 下一页

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
...