java hql_Hibernate之HQL

HQL介绍

Hibernate中不使用SQL而是有自己的面向对象查询语言,该语言名为Hibernate查询语言(Hibernate Query Language).HQL被有意设计成类似SQL,这样开发人员可以利用已有的SQL知识,降低学习坡度.它支持常用的SQL特性,这些特性被封装成面向对象的查询语言,从某种意义上来说,由HQL是面向对象的,因此比SQL更容易编写.

本文将逐渐介绍HQL的特性.

查询数据库中所有实例

要得到数据库中所有实例,HQL写为”from 对象名”即可,不需要select子句,当然更不需要Where子句.代码如右.

Query query=session.createQuery("from User");

List users=(List)query.list();

for(User user:users){

System.out.println(user);

}

限制返回的实例数

设置查询的maxResults属性可限制返回的实例(记录)数,代码如右:

Query query=session.createQuery("from User order by name");

query.setMaxResults(5);

List users=(List)query.list();

System.out.println("返回的User实例数为"+users.size());

for(User user:users){

System.out.println(user);

}

分页查询

分页是Web开发的常见课题,每种数据库都有自己特定的分页方案,从简单到复杂都有.在Hibernate中分页问题可以通过设置firstResult和maxResult轻松的解决.

代码如右:

Query query=session.createQuery("from User order by name");

query.setFirstResult(3);

query.setMaxResults(5);

List users=(List)query.list();

System.out.println("返回的User实例数为"+users.size());

for(User user:users){

System.out.println(user);

}

条件查询

条件查询只要增加Where条件即可.

代码如右:

Hibernate中条件查询的实现方式有多种,这种方式的优点在于能显示完整的SQL语句(包括参数)如下.

select

user0_.ID as ID0_,

user0_.name as name0_,

user0_.pswd as pswd0_,

user0_.email as email0_,

user0_.lastLoginTime as lastLogi5_0_,

user0_.lastLoginIp as lastLogi6_0_

from

USERTABLE_OKB user0_

where

user0_.name like '何%'

public static void fetchByName(String prefix){

Session session=HibernateUtil.getSession();

Query query=session.createQuery("from User where name like'"+prefix+"%'");

List users=(List)query.list();

System.out.println("返回的User实例数为"+users.size());

for(User user:users){

System.out.println(user);

}

HibernateUtil.closeSession(session);

}

位置参数条件查询

HQL中也可以象jdbc中PreparedStatement一样为SQL设定参数,但不同的是下标从0开始.

代码如右:

public static void fetchByPos(String prefix){

Session session=HibernateUtil.getSession();

Query query=session.createQuery("from User where name=?");

// 注意下标是从0开始,和jdbc中PreparedStatement从1开始不同

query.setParameter(0, prefix);

List users=(List)query.list();

System.out.println("返回的User实例数为"+users.size());

for(User user:users){

System.out.println(user);

}

HibernateUtil.closeSession(session);

}

命名参数条件查询

使用位置参数条件查询最大的不便在于下标与?号位置的对应上,如果参数较多容易导致错误.这时采用命名参数条件查询更好.

使用命名参数时无需知道每个参数的索引位置,这样就可以节省填充查询参数的时间.

如果有一个命名参数出现多次,那在每个地方都会设置它.

public static void fetchByNamedParam(){

Session session=HibernateUtil.getSession();

Query query=session.createQuery("from User where name=:name");

query.setParameter("name", "李白");

List users=(List)query.list();

System.out.println("返回的User实例数为"+users.size());

for(User user:users){

System.out.println(user);

}

HibernateUtil.closeSession(session);

}

命名查询

命名查询是嵌在XML映射文件中的查询。通常,将给定对象的所有查询都放在同一文件中,这种方式可使维护相对容易些。命名查询语句写在映射定义文件的最后面。

执行代码如下:

Session session=HibernateUtil.getSession();

Query query=session.getNamedQuery("user.sql");

List users=(List)query.list();

System.out.println("返回的User实例数为"+users.size());

for(User user:users){

System.out.println(user);

}

HibernateUtil.closeSession(session);

映射文件节选:

table="USERTABLE_OKB" lazy="false">

posted on 2008-04-30 16:55 和风细雨 阅读(6254) 评论(1)  编辑  收藏 所属分类: Hibernate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值