- 浏览: 180880 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
枫了的红叶儿:
事务与存储过程的区别 -
黄进宝与wys:
...
Mysql事务处理 -
youshenxuzuo:
您好, 我有个问题想请教一下。关于start方法启动线程,自动 ...
java thread: run方法和john方法 -
Leisurez:
[i][u]引用[list]
[*]
[/list][/u][ ...
Hibernate的查询方式 -
Leisurez:
[flash=200,200][/flash]
Hibernate的查询方式
Hibernate的查询方式有:
1.使用主键id加载对象(load(),get());
2.通过对象导航,比如通过stu.getTeam()得到team的实例;
3.使用hql;
4.使用qbc(query by criteria)
5.直接使用sql语句取得记录集;
一般都使用后面三种方式.
注意.hql是面向对象的查询.语法和sql是基本一样的.不区分大小写的,但是注意的是对与对象.必须遵循对象的大小写.因为hql是对像查询..同时我们必须清楚.hql只能取得对象,而不支持uid(update,insert.delete)
HQL功能最强大,适合各种情况,但是动态条件查询构造起来很不方便
Criteria最适合动态条件查询,不太适合统计查询,QBE还不够强大,只适合相当简单的查询
NativeSQL可以实现特定数据库的SQL,但是可移植性就牺牲了
Hibernate2的Criteria功能不够完善,所以Hibernate2上面可用的只有HQL和NativeSQL,Hibernate3的Criteria已经非常强大了。
针对web应用来说,大部分常规查询都是动态条件查询,所以首选使用Criteria,并且Hibernate3提供了DetachedCriteria,可以在web层构造好DetachedCriteria再进入session执行查询,非常方便实用的特性。
但是涉及到统计查询和非常复杂的关联查询,Criteria就无能为力了,这种情况下我选择使用HQL。
以下是HQL/QBC/Native SQL三种查询策略
HQL策略:
Java代码
session.createQuery("FROM Category c where c.name like 'Laptop%'");
session.createQuery("FROM Category c where c.name like 'Laptop%'");
QBC策略:
Java代码
session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%"));
session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%"));
Native SQL策略
Java代码
session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").
addEntity("c",Category.class);
session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").
addEntity("c",Category.class);
节 8.02 分页查询
Java代码
Criteria criteria = session.createCriteria(Category.class)
.add(Restrictions.like("name", "Laptop%"));
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);//初始行数
criteria.setMaxResults(20);//每页显示行数
Criteria criteria = session.createCriteria(Category.class)
.add(Restrictions.like("name", "Laptop%"));
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);//初始行数
criteria.setMaxResults(20);//每页显示行数
节 8.03 数据过滤
方法 说明
Restrictions.eq =
Restrictions.allEq 利用Map来进行多个等于的限制
Restrictions.gt >
Restrictions.ge >=
Restrictions.lt <
Restrictions.le <=
Restrictions.between BETWEEN
Restrictions.like LIKE
Restrictions.in in
Restrictions.and and
Restrictions.or or
Restrictions.sqlRestriction 用SQL限定查询
(a) 应用限制
Java代码
Criterion emailEq = Restrictions.eq("email", "w@163.com");
Criteria criteria = session.createCriteria(User.class);
criteria.add(emailEq);
User user = (User)criteria.uniqueResult();
Criterion emailEq = Restrictions.eq("email", "w@163.com");
Criteria criteria = session.createCriteria(User.class);
criteria.add(emailEq);
User user = (User)criteria.uniqueResult();
(b) 比较表达式
Java代码
Restrictions.between("amount", new BigDecimal(100), new BigDecimal(200));
Restrictions.gt("amount", new BigDecimal(100));
Restrictions.in("email", emails);//注:emails为集合
Restrictions.isNull("email");
Restrictions.isNotNull("email");
Restrictions.isEmpty("bids");
Restrictions.sizeGe("bids", 3);//bids属性大小
Restrictions.between("amount", new BigDecimal(100), new BigDecimal(200));
Restrictions.gt("amount", new BigDecimal(100));
Restrictions.in("email", emails);//注:emails为集合
Restrictions.isNull("email");
Restrictions.isNotNull("email");
Restrictions.isEmpty("bids");
Restrictions.sizeGe("bids", 3);//bids属性大小
(c) 字符串匹配
Java代码
Restrictions.like("email", "G%");
Restrictions.like("email", "G%",MatchMode.START);
注:MatchMode分为START,END,ANYWHERE,EXACT四种模式
Restrictions.like("email", "G%").ignoreCase();
Restrictions.like("email", "G%");
Restrictions.like("email", "G%",MatchMode.START);
注:MatchMode分为START,END,ANYWHERE,EXACT四种模式
Restrictions.like("email", "G%").ignoreCase();
(d) 组合表达式和逻辑操作符
Java代码
Restrictions.or(
Restrictions.and(
Restrictions.like("firstname", "G%"),
Restrictions.like("lastname", "K%")),
Restrictions.in("email",emails));
Restrictions.or(
Restrictions.and(
Restrictions.like("firstname", "G%"),
Restrictions.like("lastname", "K%")),
Restrictions.in("email",emails));
(e) SQL表达式
Java代码
Restrictions.sqlRestriction("{alias}.name='tie' and {alias}.addr='dalian'");
Restrictions.sqlRestriction("{alias}.name=?", "tie", Hibernate.STRING);//姓名为tie的对象
Restrictions.sqlRestriction("length({alias}.PASSWORD) < ?",5,Hibernate.INTEGER);
//密码小于5个字符对象
Restrictions.sqlRestriction("'100' >all( select b.AMOUNT FROM BID b " +
" WHERE b.ITEM_ID = {alias}.ITEM_ID)");//返回出价不大于100
Restrictions.sqlRestriction("{alias}.name='tie' and {alias}.addr='dalian'");
Restrictions.sqlRestriction("{alias}.name=?", "tie", Hibernate.STRING);//姓名为tie的对象
Restrictions.sqlRestriction("length({alias}.PASSWORD) < ?",5,Hibernate.INTEGER);
//密码小于5个字符对象
Restrictions.sqlRestriction("'100' >all( select b.AMOUNT FROM BID b " +
" WHERE b.ITEM_ID = {alias}.ITEM_ID)");//返回出价不大于100
(f) 子查询
节 8.04 表关联
(a) 隐式关联
隐式关联有两种方法:
1、 Criteria接口的createCriteria()方法:
Java代码
session.createCriteria(Item.class)
.add(Restrictions.like("description", "Foo",MatchMode.ANYWHERE))
.createCriteria("bids")
.add(Restrictions.gt("amount",new BigDecimal(100)));
session.createCriteria(Item.class)
.createCriteria("seller")
.add(Restrictions.like("email", "%@"));
session.createCriteria(Item.class)
.add(Restrictions.like("description", "Foo",MatchMode.ANYWHERE))
.createCriteria("bids")
.add(Restrictions.gt("amount",new BigDecimal(100)));
session.createCriteria(Item.class)
.createCriteria("seller")
.add(Restrictions.like("email", "%@"));
2、 分配别名:
Java代码
session.createCriteria(Item.class)
.createAlias("bids","b")
.add(Restrictions.like("description", "%Foo%"))
.add(Restrictions.gt("b.amount", new BigDecimal(100)));
session.createCriteria(Item.class)
.createAlias("seller", "s")
.add(Restrictions.like("s.email","%@"));
session.createCriteria(Item.class)
.createAlias("bids","b")
.add(Restrictions.like("description", "%Foo%"))
.add(Restrictions.gt("b.amount", new BigDecimal(100)));
session.createCriteria(Item.class)
.createAlias("seller", "s")
.add(Restrictions.like("s.email","%@"));
(b) 抓取关联
Java代码
session.createCriteria(Item.class)
.setFetchMode("bids",FetchMode.JOIN)
.add(Restrictions.like("description", "%Foo%"))
session.createCriteria(Item.class)
.setFetchMode("bids",FetchMode.JOIN)
.add(Restrictions.like("description", "%Foo%"))
节 8.05 投影/报表查询
(a) 简单投影
Java代码
session.createCriteria(Item.class)
.add(Restrictions.gt("endDate", new Date()))
.setProjection(Projections.id());//返回单一属性
session.createCriteria(Item.class).setProjection(
Projections.projectionList().add(Projections.id()).
add(Projections.property("description")));//返回一个Object[]
session.createCriteria(Item.class)
.add(Restrictions.gt("endDate", new Date()))
.setProjection(Projections.id());//返回单一属性
session.createCriteria(Item.class).setProjection(
Projections.projectionList().add(Projections.id()).
add(Projections.property("description")));//返回一个Object[]
(b) 统计分组
Java代码
session.createCriteria(Item.class)
.setProjection(Projections.rowCount());
session.createCriteria(Item.class)
.setProjection(Projections.projectionList()
.add(Projections.rowCount())
.add(Projections.sum("sales"))
.add(Projections.avg("score"))
);
session.createCriteria(Bid.class)
.createAlias("bidder", "u")
.setProjection(Projections.projectionList()
.add(Property.forName("u.id").group())
.add(Property.forName("u.username").group())
.add(Property.forName("id").count())
.add(Property.forName("amount").avg())
);
session.createCriteria(Item.class)
.setProjection(Projections.rowCount());
session.createCriteria(Item.class)
.setProjection(Projections.projectionList()
.add(Projections.rowCount())
.add(Projections.sum("sales"))
.add(Projections.avg("score"))
);
session.createCriteria(Bid.class)
.createAlias("bidder", "u")
.setProjection(Projections.projectionList()
.add(Property.forName("u.id").group())
.add(Property.forName("u.username").group())
.add(Property.forName("id").count())
.add(Property.forName("amount").avg())
);
(c) SQL投影
Java代码
String sqlFragment = "(select count(*) from Item i where i.item_id = item_id) "
+ " as numofitems";
session.createCriteria(Bid.class).createAlias("bidder", "u")
.setProjection(
Projections.projectionList().add(
Projections.groupProperty("u.id")).add(
Projections.groupProperty("u.username")).add(
Projections.count("id")).add(
Projections.avg("amount")).add(
Projections.sqlProjection(sqlFragment,
new String[] { "numofitems" },
new Type[] { Hibernate.LONG }))
);
评论
[list] [*] [/list]
发表评论
-
JSF2.1+Spring3.1+JPA(Hibernate3.6)配置实例
2011-12-16 11:19 2965首先搭建环境,就不具体说了,我用的是eclipse ... -
JSF2.1+Spring3.1+JPA(Hibernate3.6)配置实例
2011-12-16 10:24 0首先搭建环境,就不具体说了,我用的是eclipse(不是mye ... -
Hibernate的延迟加载
2011-02-16 11:54 807Hibernate对象关系映射提供延迟的与非延迟的 ... -
Hibernate的load()、get()、list()、iterator()方法的区别
2011-02-16 11:36 1686开发中,通常是通过两种方式来执行对数据库的查询操作的。一种方式 ... -
Hibernate的缓存机制
2011-02-16 10:06 802缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对 ... -
SSH 整合开发问题总结与备忘
2011-01-23 21:05 1115一、Hibernate 1.Hibernate Ex ... -
java中用Ganymed实现SCP 和SFTP文件传输
2010-12-24 14:45 16472备忘。 下载jar包:ganymed-ssh2-build21 ... -
JSP问题汇总
2009-12-04 17:41 864在web.xml不认<taglib>解决办 ... -
How to use log4j in eclipse
2009-11-16 17:16 1117# HOW TO USE LOG4J WITHIN ECLIP ... -
eclipse 3.4 三大框架(struts+hibernate+spring)搭建
2009-02-12 16:30 5281eclipse 3.4 三大框架(struts+hiberna ... -
jbo简介ss Seam
2009-02-12 16:30 1186什么是Seam? JBoss Seam是“Java EE 5 ... -
从spring+struts到grails
2008-12-26 18:08 968虽然网上大量有人在宣传从Spring+Struts平台迁移到G ...
相关推荐
Hibernate3.x查询方式代码示例,详细教程参考我的Blog:http://blog.csdn.net/boyazuo
hibernate查询方法 大全 hql等
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置...hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
hibernate中,对其中的查询方式进行总结,包括hql查询,条件查询,sql查询等
六种方式实现hibernate查询,六种方式实现hibernate查询,六种方式实现hibernate查询
利用MYSQL数据库提供的样例数据库world建立的查询小例子。已经建立好了数据库对应的...本项目主要是为了练习使用Hibernate查询数据库。如果有什么问题可以发站内信或者邮件asddf14@hotmail.com。我会尽量解答一下~~~
三种查询方式跟踪Hibernate源码 学习源码必备
get() and load() HQL 等查询方式
Hibernate注解方式、HQL查询
hibernate的查询方式介绍和hibernate的批处理和连接池配置hibernate
数据查询与检索是Hibernate中的一... *标准化对象查询(Criteria Query):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统
该源代码配了了解释,针对hibernate中多表查询的多种形式进行了总结,很有价值,有Object[]形式的查询,也有对象方式的查询 也有集合list形式的查询,
如果你正在学hibernate框架,我认为这份文档对你会有很大的关系。 如果你真的需要可以下载啊,积分又不是很多是吧,关键能学到知识就行了
NULL 博文链接:https://364232252.iteye.com/blog/2368725
hibernate的查询,对象状态以及数据加载方式
Hibernate常用操作示例,包含详细注释说明,数据库初始化文件。使用和学习请参考:http://blog.csdn.net/daijin888888/article/details/51692942
后台的查询功能单独用类StudentDao封装(与Action类脱离),StudentDao使用Spring创建,StudentDao中支持参数flag,0时直接使用静态数据查询,1时使用hibernate查询数据库,flag值采用Spring方式赋值(在xml中配置)
封装hibernate查询方式(JPA)