ITEEDU

Hibernate Gossip: 第二个 Hibernate

第一个 Hibernate 中介绍如何使用Hibernate在不使用SQL的情况下,以Java中操作对象的习惯来插入数据至数据库中,当然储存数据之后,更重要的是如何将资料读出,Hibernate中也可以让您不写一句SQL,而以Java中操作对象的习惯来查询数据。

直接来看个范例:
SecondHibernate.java
package onlyfun.caterpillar;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Expression;

public class SecondHibernate {

public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();

Criteria criteria = session.createCriteria(User.class);
// 查询user所有字段
List users = criteria.list();
Iterator iterator = users.iterator();
System.out.println("id \t name/age");
while(iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId() +
" \t " + user.getName() +
"/" + user.getAge());
}

// 查询user中符合条件的字段
criteria.add(Expression.eq("name", "caterpillar"));
users = criteria.list();
iterator = users.iterator();
System.out.println("id \t name/age");
while(iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId() +
" \t " + user.getName() +
"/" + user.getAge());
}

session.close();
sessionFactory.close();
}
}
Criteria对SQL进行封装,对于不甚了解SQL的开发人员来说,使用Criteria也可以轻易的进行各种数据的检索,您也可以使用 Expression设定查询条件,并将之加入Criteria中对查询结果作限制,Expression.eq()表示设定符合条件的查询,例如 Expression.eq("name", "caterpillar")表示设定查询条件为"name"字段中为"caterpillar"的数据。

先来看一下执行结果:
Hibernate: select this_.id as id0_, this_.name as name0_0_, this_.age as age0_0_ from user this_
id      name/age
1      caterpillar/30
3      bush/5
2     momor/26

Hibernate: select this_.id as id0_, this_.name as name0_0_, this_.age as age0_0_ from user this_ where this_.name=?
id      name/age
1      caterpillar/30


Criteria是对象导向式的查询方式,让不了解SQL的开发人员也可以轻易进行各项查询,但Criteria的API目前还不是很完善,而Hibernate鼓励的查询方式,是透过HQL(Hibernate Query Language)来进行,直接来看个实例:
SecondHibernate.java
package onlyfun.caterpillar;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class SecondHibernate {

public static void main(String[] args) {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();

// 使用HQL建立查询
Query query = session.createQuery("from User");
List users = query.list();
Iterator iterator = users.iterator();
System.out.println("id \t name/age");
while(iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId() +
" \t " + user.getName() +
"/" + user.getAge());
}

System.out.println();

// 使用HQL建立查询
query = session.createQuery("from User user where user.name like ?");
// 设定查询参数
query.setParameter(0, "caterpillar");
users = query.list();
iterator = users.iterator();
System.out.println("id \t name/age");
while(iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println(user.getId() +
" \t " + user.getName() +
"/" + user.getAge());
}

session.close();
sessionFactory.close();
}
}
执行结果:
Hibernate: select this_.id as id0_, this_.name as name0_0_, this_.age as age0_0_ from user this_
id      name/age
1      caterpillar/30
3      bush/5
2     momor/26

Hibernate: select this_.id as id0_, this_.name as name0_0_, this_.age as age0_0_ from user this_ where this_.name=?
id      name/age
1      caterpillar/30


透过Query接口,您可以先设定查询参数,之后透过setXXX()等方法,将指定的参数值填入,而不用每次都撰写完整的HQL,Query的setParameter()方法第一个参数是指定 ? 出现的位置,从 0 开始,第二个参数则是设定查询条件。