- 浏览: 548963 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
coosummer:
推荐使用http://buttoncssgenerator.c ...
【转载】CSS圆角按钮(一) -
saiarmuluo:
不错,支持。
java log4j日志 写入数据库 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Freemarker 使用 -
zlbdexiaohao:
棒棒的
flex ToolTip汇总 -
hw_128:
demo的代码的,能不能发一下,谢谢 qq257515270 ...
java log4j日志 写入数据库
Criteria Query通过面向对象的设计,将数据查询条件封装为一个对象。简单来说,Criteria Query可以看作是传统SQL的对象化表示,如:
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1));
这里的criteria实例本质上是对SQL“select * from t_user where name='Erica' and sex=1”的封装。
Hibernate在运行期会根据Criteria中指定的查询条件生成相应的SQL语句。
Criteria查询表达式
Criteria本身只是一个容器,具体的查询条件要通过Criteria.add方法添加到Criteria实例中。
方法 | 描述 |
Expression.eq |
对应SQL “field=value”表达式 如:Expression.eq("name","Erica") |
Expression.allEq | 参数为一个Map对象,其中包含了多个属性-值对应关系。相当于多个Expression.eq关系的叠加 |
Expression.gt | 对应SQL“field>value”表达式 |
Expression.ge | 对应SQL“field>=value”表达式 |
Expression.lt | 对应SQL“field<value”表达式 |
Expression.le | 对应SQL“field<=value”表达式 |
Expression.between |
对应SQL“between”表达式 如:Expression.between("age",new Integer(13),new Integer(50)); |
Expression.like | 对应SQL"field like valule"表达式 |
Expression.in | 对应SQL“field in...”表达式 |
Expression.eqproperty | 用于比较两个属性之间的值,对应SQL“field>field” |
Expression.gtProperty | 用于比较两个属性之间的值,对应SQL“field>=field” |
Expression.ltProperty | 用于比较两个属性之间的值,对应SQL"field<field" |
Expression.leProperty | 用于比较两个属性之间的值,对应SQL"field<=field" |
Expression.and |
and关系组合,如: Expression.add(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1))) |
Expression.or |
or关系组合,如: Expression.or(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1))) |
Expression.sql |
作为补充,本方法提供了原生SQL语法的支持,我们可以通过这个方法直接通过SQL语句限定查询条件 下面的代码返回所有名称以"Erica"其实的记录: |
在Hibernate3中,引入了Restrictions类作为Expression的替代。
示例查询
Example类实现了Criteria接口,同样,它也可以用作Criteria的查询条件。Example的作用是:根据已有对象,查找属性与之相符的其他对象。
TUser exampleUser=new TUser();
exapleUser.getName("Erica");
criteria.add(Example.create(exampleUser));
List<TUser> list=criteria.list();
for(TUser user:list){
System.out.println(user.getName());
}
新建一个TUser对象exampleUser,并作为范本,查询所有name属性与之相同的记录。
复合查询
Criteria addrCriteria=criteria.createCriteria("addresses");
addrCriteria.add(Expression.like("addresses","%shanghai%"));
List<TUser> list = criteria.list();
for(TUser user:list){
System.out.println(user.getName());
Set<TAddress> addrSet=user.getAddresses();
for(TAddress addr:addrSet){
System.out.println(addr.getAddress());
}
}
红色部分就是我们新增的复合查询条件,可以看到,我们可以通过Criteria.createCriteria方法在原有Criteria对象的基础上构建复合查询。
DetachedCriteria
Hibernate2中,Criteria生命周期位于其宿主Session生命周期中,也就是说,由某个session创建的Criteria实例,一旦session销毁,那么此Criteria实例也随之失效。
Hibernate3中引入了DetachedCriteria,DetachedCriteria可以脱离session实例独立存在,这样,我们就可以将某些通用的Criteria查询条件进行抽离,每次使用时再与当前session实例绑定以获得更好的代码重用效果。
deCriteria.add(Expression.eq("name","Erica"));
deCriteria.add(Expression.eq("sex",new Integer(1)));
Criteria criteria=deCriteria.getExecutableCriteria(session);
List<TUser> list=criteria.list();
for(TUser user:list){
System.out.println(user.getName());
}
DetachedCriteria的生存周期与session实例无关,我们可以独立创建DetachedCriteria实例,并在需要使用时与session相绑定,从而获得运行期Criteria实例。这样,我们就可以将查询逻辑和Criteria实例分离,以获得最大化代码的重用效果。
DetachedCriteria也可以用于子查询表达:
avgAge.setProjection(Projections.avg("age"));
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Subqueries.propertyGT("age",avgAge));
通过Subqueries我们可以将DetachedCriteria纳入查询表达式,反映在SQL上则是一个典型的子查询语句。上例生成的SQL语句大致如:select ... from T_User where age > (select avg(age) from T_User)
Criteria高级特性
限定返回的记录范围
通过criteria.setFirstResult/setMaxResults方法可以限制一次查询返回的记录范围:
//限定查询返回检索结果中,从100条结果开始的20条记录
criteria.setFirstResult(100);
criteria.setMaxResults(20);
记录排序:
//
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq("groupId",new Integer(2)));
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("groupId"));
分组与统计
在Hibernate3中,我们还可以通过Criteria完成分组和统计。分组、统计表达式由Hibernate3新引入的Projections Class进行封装。
criteria.setProjection(Projections.groupProperty("age"));
List<TUser> list=criteria.list();
for(TUser user:list){
System.out.println(user);
}
上例对当前的TUser记录按照年龄进行分组。通过Projections.groupProperty方法,我们指定了用于分组的目标属性“age”。生成的SQL语句:select this.age as y0_ from T_User this_group by this_.age。
另外,对于多条件组合的统计、分组功能,我们可以借助ProjectionList完成,下面的例子中,我们统计了各个年龄层次中的用户数量:
projectionList.add(Projections.groupProperty("age"));
projectionList.add9Projections.rowCount());
Criteria criteria=session.createCriteria(TUser.class);
criteria.setProjection(projectionList);
本文转载:http://www.cnblogs.com/MeChecksV/
发表评论
-
【转】java中volatile关键字的含义
2013-05-12 16:06 1008用在多线程,同步变量。 线程为了提高效率,将某成员变量(如A ... -
java 收集
2012-10-22 09:16 0OpenSessionInViewFilter在查询完之后不提 ... -
java连接sql时候,获取表格各列属性
2012-10-19 18:09 0import java.sql.Connection; ... -
【转载】log4j 日志大小
2012-03-23 19:31 10661今天群里一个哥们问一 ... -
spring bean 自定义作用域
2012-02-18 15:02 4337一般都知道spring2.x bean的作用域 Bean ... -
【转】java获取jar文件位置
2012-02-16 21:04 2039网络转载 在编程的时候如果在工程中无意中导入多个同样的jar ... -
java 逐位运算符
2012-01-22 16:53 4545运算符归类: 一元运算符:逻辑运算符(!),非运算符( ... -
hibernate hql
2011-12-15 20:05 0hibernate -hql 1.hql中最简单的查询 f ... -
Hibernate初探(二)
2011-12-15 16:32 38hql 关联查询fetch hql code: from Te ... -
hibernate 复合主键
2011-11-01 19:30 1361hibernate 复合主键 在实体中可以定义一个嵌入式组件( ... -
28234行的java 类文件
2011-08-29 16:04 937有图为证:28234行的java 类文件 各位有没有???见过 ... -
递归显示文件夹下文件
2011-08-10 14:43 920public static void main(String[ ... -
java.lang.UnsupportedClassVersionError异常解决办法
2011-06-14 14:32 1531出现错误的原因: 是因为我们使用高版本的JDK编译的Java ... -
内部类修改外部类属性
2011-06-10 16:55 5710public class Test { public Str ... -
java log4j日志 写入数据库
2011-06-01 20:57 11306因一个群朋友log4j日志 ... -
eclipse改图片
2011-05-14 08:44 1234例如:eclipse目录在 D:\rd\eclipse3.3 ... -
【转载】<s:doubleselect>标签的使用
2011-01-05 08:49 5499本文装载自:http://karidyang.iteye.co ... -
spirng2.x-入门
2011-01-04 09:50 958Spring 2.5 中除了提供 @Component 注释外 ... -
自定义 StringUtil 处理类
2011-01-04 09:41 1187isNumber //判读是不是数字 isDate//判读 ... -
struts2 页面国际化
2010-12-29 15:24 1100//输出配置文件中的属性<s:text name=&qu ...
相关推荐
ta_lib-0.5.1-cp312-cp312-win32.whl
课程设计 在线实时的斗兽棋游戏,时间赶,粗暴的使用jQuery + websoket 实现实时H5对战游戏 + java.zip课程设计
ta_lib-0.5.1-cp310-cp310-win_amd64.whl
基于springboot+vue物流系统源码数据库文档.zip
GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载
知识图谱
333498005787635解决keil下载失败的文件.zip
【微信机器人原理与实现】 微信机器人是通过模拟微信客户端的行为,自动处理消息、发送消息的程序。在Python中实现微信机器人的主要库是WeChatBot,它提供了丰富的接口,允许开发者方便地进行微信消息的接收与发送。这个项目标题中的"基于python实现的微信机器人源码"指的是使用Python编程语言编写的微信机器人程序。 1. **Python基础**:Python是一种高级编程语言,以其简洁的语法和强大的功能深受开发者喜爱。在实现微信机器人时,你需要熟悉Python的基本语法、数据类型、函数、类以及异常处理等概念。 2. **微信API与WeChatBot库**:微信为开发者提供了微信公共平台和微信开放平台,可以获取到必要的API来实现机器人功能。WeChatBot库是Python中一个用于微信开发的第三方库,它封装了微信的API,简化了消息处理的流程。使用WeChatBot,开发者可以快速搭建起一个微信机器人。 3. **微信OAuth2.0授权**:为了能够接入微信,首先需要通过OAuth2.0协议获取用户的授权。用户授权后,机器人可以获取到微信用户的身份信息,从而进行
基于springboot实验室研究生信息管理系统源码数据库文档.zip
张力控制,色标跟踪,多轴同步,电子凸轮,横切等工艺控制案例。
在Python编程环境中,处理Microsoft Word文档是一项常见的任务。Python提供了几个库来实现这一目标,如`python-docx`,它可以让我们创建、修改和操作.docx文件。本教程将重点介绍如何利用Python进行Word文档的合并、格式转换以及转换为PDF。 1. **合并Word文档(merge4docx)** 合并多个Word文档是一项实用的功能,特别是在处理大量报告或文档集合时。在Python中,可以使用`python-docx`库实现。我们需要导入`docx`模块,然后读取每个文档并将其内容插入到主文档中。以下是一个基本示例: ```python from docx import Document def merge4docx(file_list, output_file): main_doc = Document() for file in file_list: doc = Document(file) for paragraph in doc.paragraphs: main_doc.add_paragraph(paragraph.text) m
基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip
基于springboot餐品美食论坛源码数据库文档.zip
基于springboot亚运会志愿者管理系统源码数据库文档.zip
使用WPF的数据样式绑定,切换对象数据值来完成控件动态切换背景渐变动画效果。 使用动画样式渲染比线程修改性能消耗更低更稳定
基于SpringBoot的企业客源关系管理系统源码数据库文档.zip
基于springboot+vue的桂林旅游网站系统源码数据库文档.zip
基于springboot嗨玩旅游网站源码数据库文档.zip
基于springboot的流浪动物管理系统源码数据库文档.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip