hibernate查询,hibernate怎样查询数据库里面的所有数据
hibernate查询,hibernate怎样查询数据库里面的所有数据详细介绍
本文目录一览: Hibernate怎样用HQL语句查询?
HQL语句操作的是po类,也就是实体类。hql通过映射文件,将类名和表名、类属性和表字段一一对应起来。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据。
使用HQL查询的代码一:
public void test01() { Session session = HibernateUtils.openSession(); Query query = session.createQuery("from Student"); List
stus = query.list(); for (Student stu : stus) { System.out.println(stu); } }代码二:
public void test02() { Session session = HibernateUtils.openSession(); Query query = session.createQuery("select stu from Student stu"); List
stus = query.list(); for (Student stu : stus) { System.out.println(stu); } }
hibernate的多条件动态查询
在hibernate中是支持多条件动态查询的 这种问题是非常实用的 比如说你做一个项目要实现一个复合查询
例如有这么一个界面
那么要实现这个查询 对于用户来说他的查询条件可能不健全 有可能只填写其中的 项 那么要实现这个查询 我们可以用hibernate的动态条件查询
下面我写一个例子
我有一张表叫user表
package fish testdao;
import java sql Date;
public class User {
int id;
String name;
int age;
Date brithday;
public String getName() {
returnname;
}
public void setName(String name) {
this name = name;
}
public int getAge() {
returnage;
}
public void setAge(int age) {
this age = age;
}
public Date getBrithday() {
returnbrithday;
}
public void setBrithday(Date brithday) {
this brithday = brithday;
}
public int getId() {
returnid;
}
public void setId(int id) {
this id = id;
}
}
User hbm xml
//Hibernate/HibernateMapping DTD //EN
hiber/hibernate mapping dtd >
在XXX cgf xml注册一下
然后我们写一个测试类
package fish domain;
import java sql Date;
import java util List;
import hibernate Criteria;
import hibernate Session;
import hibernate Transaction;
import hibernate criterion DetachedCriteria;
import hibernate criterion Restrictions;
import fish testdao User;
import fish util HibernateSessionFactory;
public class Test {
public static void main(String[] args) {
// addData();
queryData();
}
// 添加数据
public static void addData() {
Session session = HibernateSessionFactory getSession();
Transaction transaction = session beginTransaction();
transaction begin();
for (int i = ; i < ; i++) {
User user = new User();
user setAge( + i);
user setName( 张 + i);
user setBrithday(Date valueOf( ));
session save(user);
}
mit();
session close();
}
// 查询数据
public static void queryData() {
String outName = 张 ;
int outAge = ;
Date outDate = null;
Session session = HibernateSessionFactory getSession();
DetachedCriteria dc = DetachedCriteria forClass(User class);
if (outName !=null) {
dc add(Restrictions eq( name outName));
}
if (outAge > ) {
dc add(Restrictions eq( age outAge));
}
if (outDate !=null) {
dc add(Restrictions eq( brithday outDate));
}
Criteria c = dc getExecutableCriteria(session);
List
list = c list();
for (User i : list) {
System out println(i getName() + + i getAge());
}
}
}
看看测试类中的查询方法 如果String outName = 张 ;
intoutAge = ;
DateoutDate = null;
这三个条件是通过从前台或者是用户输入的那么就实现了多条件的动态查询
我们看看数据库的信息
显然这个里面有一条记录是符合的 我们看看输出的结果是什么
张
lishixinzhi/Article/program/Java/ky/201311/28511
Hibernate 有哪几种查询数据的方式
3种
1)session对象的load和get方法,只能按主键查询
2)hql:语法与sql类似,但查询的是对象,支持所有的sql查询方式,可以直接返回对象集合,可以完成修改删除
3)Criteria:只能进行查询,可以不用写查询语句,通过java代码完成
有三种方式,不过不是楼上说的那三种。
1.HQL查询
2.QBC查询
3.本地SQL查询
HIbernate主要有三种查询方式HQL、QBC、SQL:
1).HQL(Hibernate Query Language):hibernate数据查询语言;
2).QBC(Query By Criteria):规则查询
3).SQL:原生的SQL语句(较为复杂的情况下使用)
想要详细了解的可以看一下下面的几篇文章:
QBC数据查询
HQL单表查询
HQL多表查询
希望对你有所帮助~
Hibernate有几种查询方法
Hibernate有4种查询方法。
HQL 通过Hibernate提供的查询语言进行查询。Hibernate Query lanague
EJBQL(JPQL 1.0) 是EJB提供的查询语言
QBC(query by cretira)通过Cretira接口进行查询
QBE(query by Example) 通过Example编程接口进行查询
从功能强弱上排序:NativeSQL > HQL > EJBQL(JPQL 1.0) >QBC(query by cretira) >QBE(query by Example) 1: QBE (Query By Example) QBC查询方式。
QBC(Query By Criteria)查询方式是 Hibernate 提供的“ 更加面向对象”的一种检索方式。 QBC 在条件查询上比 HQL 查询更为灵活,而且支持运行时动态天生查询语句。
在Hibernate 应用中使用 QBC 查询通常经过 3 个步骤:
(1)使用 Session 实例的 createCriteria() 方法创建 Criteria 对象
(2)使用工具类 Restrictions 的相关方法为 Criteria 对象设置查询对象
(3)使用 Criteria 对象的 list() 方法执行查询,返回查询结果QBE查询QBE查询就是检索与指定样本对象具有相同属性值的对象。因此QBE 查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。 QBE 查询的功能子集,固然 QBE 没有 QBC 功能大,但是有些场合 QBE 使用起来更为方便。
工具类Example 为 Criteria 对象指定样本对象作为查询条件Java代码:
1 Session session = HibernateSessionFactory.getSessionFactory().openSe ssion();
2 Transaction ts = session.beginTransaction();
3 Customer c = new Customer();
4 c.setCname("Hibernate");
5 Criteria criteria = session.createCriteria(Customer. class );
6 Criteria.add(Example.create(c));
7 Iterator it = criteria.list().iterator();
8 ts.commit();
9 HibernateSessionFactory.closeSession();
我只说 我常用的几种 Hibernate hql查询方法
Hibernate 在Spring管理下 可以用类继承了(extends) HibernateDaoSupport
然后 下面是一个我熟悉的写法:
public List
find(final String hql, final int currentPage, final int pageSize,
final String[] params)
{
return this.getHibernateTemplate().executeFind(new HibernateCallback()
{
@Override
public Object doInHibernate(Session session) throws HibernateException,
SQLException
{
Query query = session.createQuery(hql);
for(int i =0 ;i
<params.length;i++)
{
query.setString(i, params[i]);
}
query.setFirstResult(PageUtil.startRec(currentPage, pageSize));
query.setMaxResults(pageSize);
return query.list();
}
});
}
调用和传递参数
String hql ="from Prov p where p.prov_id like ? and p.prov_name like ?";
String[] params ={"%"+prov.getProv_id()+"%","%"+prov.getProv_name()+"%"};
return super.find(hql,currentPage,pageSize,params);
分页查询 得到 各种条件下的省市
List
list = (List
) getHibernateTemplate().find(
"from LinkUser lu where lu.userNo = '" + no + "'");
等等。
如果只用 Hibernate 简单的 直接写
protected List
find(String hql, String... params)
{
Query query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)
{
query.setString(i, params[i]);
}
return query.list();
}
或protected List
page(String hql,int currentPage,int pageSize, String... params)
{
Query query = session.createQuery(hql);
for (int i = 0; i < params.length; i++)
{
query.setString(i, params[i]);
}
query.setFirstResult(PageUtil.startRec(currentPage, pageSize));
return query.list();
}
除了以上还有criteria查询,本人没用过,网上还有许多,你自己可以搜搜,学习学习
HIbernate主要常用有三种查询方式HQL、QBC、SQL:
1).HQL(Hibernate Query Language):hibernate数据查询语言;
2).QBC(Query By Criteria):规则查询
3).SQL:原生的SQL语句(较为复杂的情况下使用)
想要详细了解的可以看一下下面的几篇文章:
QBC数据查询
HQL单表查询
HQL多表查询
希望对你有所帮助~
转录:
从点到面,讲讲hibernate查询的6种方法。分别是HQL查询
,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询。
如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要实现的一般功能,但是
从一个点,让我们掌握6中方法,则提供了更多选择。每一种方法都有其适用的情况与前提。
HQL查询
HQL是hibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点。示例代码:
static void query(String name){
Session s=null;
try{
s=HibernateUtil.getSession();
//from后面是对象,不是表名
String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。
Query query=s.createQuery(hql);
query.setString("name", name);
List
list=query.list();
for(Admin admin:list){
System.out.println(admin.getAname());
}
}finally{
if(s!=null)
s.close();
}
}
适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。
对象化查询Criteria方法:
static void cri(String name,String password){
Session s=null;
try{
s=HibernateUtil.getSession();
Criteria c=s.createCriteria(Admin.class);
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(Restrictions.eq("apassword", password));
List
list=c.list();
for(Admin admin:list){
System.out.println(admin.getAname());
}
}finally{
if(s!=null)
s.close();
}
}
适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。
动态分离查询DetachedCriteria
static List dc(DetachedCriteria dc) {
Session s = HibernateUtil.getSession();
Criteria c = dc.getExecutableCriteria(s);
List rs = c.list();
s.close();
return rs;
}
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
int id = 1;
if (id != 0)
dc.add(Restrictions.eq("id", id));
Date age = new Date();
if (age != null)
dc.add(Restrictions.le("birthday", age));
List users = dc(dc);
System.out.println("离线查询返回结果:" + users);
适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。 缺点:适用面较HQL有限。
例子查询
static List example(User user) {
Session s = HibernateUtil.getSession();
List
users = s.createCriteria(User.class).add(
Example.create(user)).list();
// List
// users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())
// .createCriteria("child").add((Example.create(user))).list();
return users;
}
适用情况:面向对象操作。 缺点:适用面较HQL有限,不推荐。
sql查询
static List sql() {
Session s = HibernateUtil.getSession();
Query q = s.createSQLQuery("select * from user").addEntity(User.class);
List
rs = q.list();
s.close();
return rs;
}
适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法 缺点:破坏跨平台,不易维护,不面向对象。
命名查询
static List namedQuery(int id) {
Session s = HibernateUtil.getSession();
Query q = s.getNamedQuery("getUserById");
q.setInteger("id", id);
return q.list();
}
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
from User where id=:id
<!-- 命名查询中使用sql,不推荐使用,影响跨数据库
-->
适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。 缺点:不面向对象。基于hql和sql,有一定缺陷。
</params.length;i++)
hibernate中的查询方式有哪些?
hibernate的查询方式主要有以下几种,你可以看看,也可以去官方下载文档来看看,不过是英文版本。,谢谢
hibernate查询方式
? 小结Hibernate...
? Hibernate对多...
? hibernate查询...
? Hibernate之查...
? Hibernate 查...
更多相关推荐...
在HQL中关键字不区分大小写,但是属性和类名区分大小写,下面介绍各种类型的Hibernate的HQL查询。
1、Hibernate HQL查询:简单属性查询
* 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
* 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致
数组的长度取决与select中属性的个数
* 如果认为返回数组不够对象化,可以采用HQL动态实例化Student对象
2、Hibernate HQL查询:实体对象查询
* N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题,所谓的N+1是在查询的时候发出了N+1条sql语句,1: 首先发出一条查询对象id列表的sql,N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
* list和iterate的区别?
* list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
* iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
3、Hibernate HQL查询:条件查询
* 可以采用拼字符串的方式传递参数
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
* 可以采用 ?来传递参数(索引从0开始)
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.name like ?").setParameter(0, "%1%").list(); //可以使用?方式传递参数 //参数的索引从0开始 //传递的参数值,不用单引号引起来 //注意方法链编程
* 可以采用 :参数名 来传递参数
Java代码:
List students = session.createQuery ("select s.id, s.name from Student s where s.name like :myname").setParameter("myname", "%1%").list();
* 如果传递多个参数,可以采用setParamterList方法
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)").setParameterList("myids", new Object[]{1, 2, 3, 4, 5}).list();
* 在HQL中可以使用数据库的函数,如:date_format
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?").setParameter(0, "2008-02").list();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //查询2008-01-10到2008-02-15创建的学生
List students =
session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?") .
.setParameter(0, sdf.parse("2008-01-10 00:00:00")) .
setParameter(1, sdf.parse("2008-02-15 23:59:59"))
.list();
4、Hibernate HQL查询:直接使用sql进行查询
Java代码:
List students = session.createSQLQuery("select * from t_student").list();
不会返回对象,而是所有属性,
5、Hibernate HQL查询:分页查询
* setFirstResult(),从0开始
* setMaxResults,每页显示多少条数据
Java代码:
List students = session.createQuery("from Student") .setFirstResult(1) .setMaxResults(2) .list();
6、Hibernate HQL查询:对象导航查询,在HQL中采用 . 进行导航
7、Hibernate HQL查询:连接查询
* 内连
Sql代码:
SELECT s.name, c.name FROM Student s (inner) join s.classes c
* 外连接(左连接/右连接)
Sql代码:
SELECT s.name, c.name FROM Student s left join s.classes c
8、Hibernate HQL查询:统计查询
Java代码:
List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +"group by c.name order by c.name").list(); for (Iterator iter=students.iterator(); iter.hasNext();) { Object[] obj = (Object[])iter.next(); System.out.println(obj[0] + ", " + obj[1]); }
9、DML风格的操作(尽量少用,因为和缓存不同步)
Java代码:
session.createQuery
("update Student s set s.name=? where s.id< ?")
.setParameter(0, "李四")
.setParameter(1, 5)
.executeUpdate();
应当尽量少用,因为和缓存不同步,也就是说,假如在执行上面的语句之前,已经把student封装成一个list曾经拿了出来,再执行上面的语句对 student中的表进行数据更新,然后再list Student表,则此时的list是从缓存中取的数据,而不是从表中找到的数据,也就是 说,list拿到的是update前的数据,所以造成了这种不同步,所以这种风格尽量少用。
从这个方面也可以看得出Hibernate并不适用于聚集性,统计,大量批量的更新,删除等操作。
hql & criteria
hibernate的查询方式主要有以下几种,你可以看看,也可以去官方下载文档来看看,不过是英文版本。希望对你有帮助,谢谢
hibernate查询方式
? 小结Hibernate...
? Hibernate对多...
? hibernate查询...
? Hibernate之查...
? Hibernate 查...
更多相关推荐...
在HQL中关键字不区分大小写,但是属性和类名区分大小写,下面介绍各种类型的Hibernate的HQL查询。
1、Hibernate HQL查询:简单属性查询
* 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
* 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致
数组的长度取决与select中属性的个数
* 如果认为返回数组不够对象化,可以采用HQL动态实例化Student对象
2、Hibernate HQL查询:实体对象查询
* N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题,所谓的N+1是在查询的时候发出了N+1条sql语句,1: 首先发出一条查询对象id列表的sql,N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
* list和iterate的区别?
* list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
* iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
3、Hibernate HQL查询:条件查询
* 可以采用拼字符串的方式传递参数
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
* 可以采用 ?来传递参数(索引从0开始)
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.name like ?").setParameter(0, "%1%").list(); //可以使用?方式传递参数 //参数的索引从0开始 //传递的参数值,不用单引号引起来 //注意方法链编程
* 可以采用 :参数名 来传递参数
Java代码:
List students = session.createQuery ("select s.id, s.name from Student s where s.name like :myname").setParameter("myname", "%1%").list();
* 如果传递多个参数,可以采用setParamterList方法
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)").setParameterList("myids", new Object[]{1, 2, 3, 4, 5}).list();
* 在HQL中可以使用数据库的函数,如:date_format
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?").setParameter(0, "2008-02").list();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //查询2008-01-10到2008-02-15创建的学生
List students =
session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?") .
.setParameter(0, sdf.parse("2008-01-10 00:00:00")) .
setParameter(1, sdf.parse("2008-02-15 23:59:59"))
.list();
4、Hibernate HQL查询:直接使用sql进行查询
Java代码:
List students = session.createSQLQuery("select * from t_student").list();
不会返回对象,而是所有属性!
5、Hibernate HQL查询:分页查询
* setFirstResult(),从0开始
* setMaxResults,每页显示多少条数据
Java代码:
List students = session.createQuery("from Student") .setFirstResult(1) .setMaxResults(2) .list();
6、Hibernate HQL查询:对象导航查询,在HQL中采用 . 进行导航
7、Hibernate HQL查询:连接查询
* 内连
Sql代码:
SELECT s.name, c.name FROM Student s (inner) join s.classes c
* 外连接(左连接/右连接)
Sql代码:
SELECT s.name, c.name FROM Student s left join s.classes c
8、Hibernate HQL查询:统计查询
Java代码:
List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +"group by c.name order by c.name").list(); for (Iterator iter=students.iterator(); iter.hasNext();) { Object[] obj = (Object[])iter.next(); System.out.println(obj[0] + ", " + obj[1]); }
9、DML风格的操作(尽量少用,因为和缓存不同步)
Java代码:
session.createQuery
("update Student s set s.name=? where s.id< ?")
.setParameter(0, "李四")
.setParameter(1, 5)
.executeUpdate();
应当尽量少用,因为和缓存不同步,也就是说,假如在执行上面的语句之前,已经把student封装成一个list曾经拿了出来,再执行上面的语句对 student中的表进行数据更新,然后再list Student表,则此时的list是从缓存中取的数据,而不是从表中找到的数据,也就是 说,list拿到的是update前的数据,所以造成了这种不同步,所以这种风格尽量少用。
从这个方面也可以看得出Hibernate并不适用于聚集性,统计,大量批量的更新,删除等操作
hibernate怎样查询数据库里面的所有数据
Hibernate查询所有数据的操作方式有三种。
1、Query
(1)使用该方法查询时,不需要编写sql语句,但是需要编写hql(Hibernate Query Language)语句,该语句是Hibernate查询语言。
(2)hql语言操作的是实体类和实体类的属性,比如查询所有数据的hql语句为:from 实体类名称。
(3)使用方法:首先创建Query对象,然后调用该对象的List方法返回数据集合。
@Test
public void test11(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getFactory();
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
/**
* 使用session对象的createQuery方法创建Query对象。
* 参数为hql语句
* 使用QUERY对象的list方法获取数据集合
*/
Query query =session.createQuery("from UserEntity");
List
list = query.list();
//使用forEach遍历集合
for (UserEntity userEntity : list) {
System.out.println(userEntity);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally{
sessionFactory.close();
}
}
2、criteria
(1)使用该对象不需要写hql语句,只需要指定实体类。
(2)使用方法:首先创建criteria对象,然后调用list返回数据集合。
@Test
public void test12(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getFactory();
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
/**
* 使用session对象的createCriteria方法创建criteria对象。
* 使用criteria对象的list方法获取数据集合
*/
Criteria criteria =session.createCriteria(UserEntity.class);
List
list = criteria.list();
//使用forEach遍历集合
for (UserEntity userEntity : list) {
System.out.println(userEntity);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally{
sessionFactory.close();
}
}
3、SQLQuery
(1)使用该对象,需要写底层的SQL语句。
(2)实现方法:首先创建该对象,然后调用list。
@Test
public void test13(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = HibernateUtils.getFactory();
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
/**
* 使用session对象的createSQLQuery方法创建SQLQuery对象。
* 使用qQLQuery对象的list方法获取数据集合,集合里面不是对象,而是数组
*/
SQLQuery qQLQuery =session.createSQLQuery("select * from t_user");
List
list = qQLQuery.list();
//使用forEach遍历集合
for (UserEntity userEntity : list) {
System.out.println(userEntity);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally{
sessionFactory.close();
}
}
Hibernate如何查询排好序的前十条数据?
presents=presentService.findByHql("from Present order by click_rate desc").subList(0, 10);
hql后面加“.”可以出现这个方法,可以实现查询前十条满足条件的数据。
......
Query query = session.createQuery(" from UserInfo order by userName desc ");
// 设置起始结果query.setFirstReslt(0);
// 设置最大记录数
query.setMaxResult(10);
query.list();
......
楼上正解。这是hibernate的分页查询。会根据数据库类型自动生成分页sql。
hibernate有两种查询排序的方式:内存排序和数据库排序。
数据库排序使用order-by属性。
内存排序使用sort属性。其中sort的属性值natural代表的是自然升序排列,unsorted代表的是不排序,此外,还可以自定义排序规则,方式是定义一个类,让其实现Comparator 接口,并且实现该接口中的compare方法,在该方法中实现排序规则即可。 然后将该自定义排序规则的类名作为sort的属性值即可。
Hibernate对多表关联查询
一、 Hibernate简介Hibernate是一个JDO工具。它的工作原理是通过文件(一般有两种:xml文件和properties文件)把值对象和数据库表之间建立起一个映射关系。这样,我们只需要通过操作这些值对象和Hibernate提供的一些基本类,就可以达到使用数据库的目的。例如,使用Hibernate的查询,可以直接返回包含某个值对象的列表(List),而不必向传统的JDBC访问方式一样把结果集的数据逐个装载到一个值对象中,为编码工作节约了大量的时间。Hibernate提供的HQL是一种类SQL语言,它和EJBQL一样都是提供对象化的数据库查询方式,但HQL在功能和使用方式上都非常接近于标准的SQL. 二、 Hibernate与JDBC的区别Hibernate与JDBC的主要区别如下:
1、 Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系。Hibernate可以用在任何JDBC可以使用的场合,从某种意义上来说,Hibernate在任何场合下取代JDBC.
2、 Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。 3、 Hibernate是做为JDBC的替代者出现的,不能用来直接和Entity Bean做对比。 三、 Hibernate 进行多表关联查询Hibernate对多个表进行查询时,查询结果是多个表的笛卡尔积,或者称为“交叉”连接。 例如:from Student, Book from Student as stu, Book as boo from Student stu, Book boo注意:让查询中的Student和Book均是表student和book对应的类名,它的名字一定要和类的名字相同,包括字母的大小写。别名应该服从首字母小写的规则是一个好习惯,这和Java对局部变量的命名规范是一致的。 下面列举一个完整的例子来说明Hibernate对多个表进行关联查询(其中粗体是我们要特别注意的地方,相应表tBookInfo和BookSelection的结构和其对应的hbm.xml、class文件就不一一列举了,有需要详细了解的朋友,请联系我):String sTest = "from tBookInfo book, BookSelection sel where book.id = sel.bookId";
Collection result = new ArrayList();
Transaction tx = null;
try {
Session session = HibernateUtil.currentSession();
tx = session.beginTransaction();
Query query = session.createQuery(sql);
result = query.list();
tx.commit();
} catch (Exception e) {
throw e;
} finally {
HibernateUtil.closeSession();
}//result list为Object[] 的集合{{Object[] } ,{Object[] } ,{Object[] } }//Object[] :{tBookInfo ,BookSelection }与查询语句的顺序有关
ArrayList sList = (ArrayList) result;
Iterator iterator1 = sList.iterator();
while (iterator1.hasNext()) {
Object[] o = (Object[]) iterator1.next();ookInfo bookInfo = (tBookInfo) o[0];
BookSelection bookSelect = (BookSelection) o[1];
System.out.println("BookInfo-Title: " + bookInfo.getTitle());
System.out.println("BookSelection-BookSelectionId: " + bookSelect.getId());
}
使用hibernate如何查询返回一个对象呢 如果数据库有很多对象又怎么查询能返回一个list
你自己封装返回类型啊。
1、你使用Hibernate的get和load方法可以查询出单个对象。
2、使用HQL语言或者说query语言来查询,你可以通过像以下例子得到一个list:
Query query = session.createQuery("from People as p order by p.username asc");
List
list = (List
)query.list(); //这里真正执行了查询动作 query.list()返回一个list容器
注意:HQL也可以查询单个对象,根据你的SQL语句来决定。