- 浏览: 150340 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
flyingcatjj:
很适合我这种刚接触的
myeclipse xfire 开发webservice实例 -
tangzlboy:
非常好,非常详细,非常中用。
linux入门 -
yzz9i:
楼主说的很是详细。
myeclipse xfire 开发webservice实例 -
zqx888191:
很再理阿!
老程序员的教诲 -
simplecat123:
...
SQLite数据读取
HQL(Hibernate Query Language) 面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要通过Query来操作,Query的创建方式: Query q = session.createQuery(hql); from Person from User user where user.name=:name from User user where user.name=:name and user.birthday < :birthday Criteria Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式: Criteria crit = session.createCriteria(DomainClass.class); 简单属性条件如:criteria.add(Restrictions.eq(propertyName, value)), criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName)) 注意 解决在映射的表名或者属性名是数据库的关键字,导致利用hibernate建表不能成功的问题 在一些数据库中 比如oracle中 user是作为一个关键字存在的 但是我们映射文件中的映射表名也是user 这样利用hibernate建表是建不了的 可以使用``符号把对应的表名或者列名给引起来 具体方法 <class name="User" table="`user`">形式解决 但是我测试后发现控制台没报错误 也输出了 sql语句 但是就是在数据库中没有表存在 建议最佳解决办法:最好建的映射的表名或者或者映射的列名最好不要是数据库中的关键字 HQL语句的两种方式 第一种:from User as user where user.name=?; 第二种:from User as user where user.name=:name; 两种使用的区别:第一种 query.setString(0, name); 第二种 query.setString("name", name)注意"name" 必须跟 hql语句的:name一致;相比第一种,第二种的优势是,不会出现列名索引对应出错,而出现录入数据不正确的情况 并且 比较好维护 操作HQL语句的Query接口 list()方法 把数据转化为list集合数据 query.setFirstResult() 设置结果集的开始位置 query.setMaxResults() 设置结果集最长索引 用在分页显示数据的数据结果 uniqueResult() 如果数据库只有一行数据,那么就可以使用这个方法去查询数据 iterate() 把查询到得数据转化为迭代器 Criteria Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式: Criteria crit = session.createCriteria(DomainClass.class); 简单属性条件如:criteria.add(Restrictions.eq(propertyName, value)), criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName)) .常用的查询限制方法 在例程9-1中,Restrictions.eq()方法表示equal,即等于的情况。Restrictions类提供了查询限制机制。它提供了许多方法,以实现查询限制。这些方法及其他一些criteria常用查询限制方法列于表9-1中。 表9-1 Criteria Query常用的查询限制方法 方 法 说 明 Restrictions.eq() equal,= Restrictions.allEq() 参数为Map对象,使用key/value进行多个等于的对比,相当于多个Restrictions.eq()的效果 Restrictions.gt() greater-than, > Restrictions.lt() less-than, < Restrictions.le() less-equal, <= Restrictions.between() 对应SQL的between子句 Restrictions.like() 对应SQL的like子句 Restrictions.in() 对应SQL的in子句 Restrictions.and() and关系 Restrictions.or() or关系 Restrictions.isNull() 判断属性是否为空,为空返回true,否则返回false Restrictions.isNotNull() 与Restrictions.isNull()相反 Order.asc() 根据传入的字段进行升序排序 Order.desc() 根据传入的字段进行降序排序 MatchMode.EXACT 字符串精确匹配,相当于“like 'value'” MatchMode.ANYWHERE 字符串在中间位置,相当于“like '%value%'” MatchMode.START 字符串在最前面的位置,相当于“like 'value%'” MatchMode.END 字符串在最后面的位置,相当于“like '%value'” 例1:查询学生名字以t开头的所有Student对象。 Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “t%”)) List list = cr.list(); Student stu = (Student)list.get(0); 或者使用另一种方式: Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “t”, MatchMode.START)) List list = cr.list(); Student stu = (Student)list.get(0); 例2:查询学生姓名在Bill, Jack和Tom之间的所有Student对象。 String[] names = {“Bill”, “Jack”, “Tom”} Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.in(“name”, names)) List list = cr.list(); Student stu = (Student)list.get(0); 例3:查询学生的年龄age等于22或age为空(null)的所有Student对象。 Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.eq(“age”, new Integer(22)); cr.add(Restrictions.isNull(“age”)); List list = cr.list(); Student stu = (Student)list.get(0); 例4:查询学生姓名以字母F开头的所有Student对象,并按姓名升序排序。 Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “F%”); cr.addOrder(Order.asc(“name”)); List list = cr.list(); Student stu = (Student)list.get(0); 调用Order.asc的方法应是Criteria的addOrder()方法。
下面给出一个小例子: 这里只列出其中一个页面,其它页面都没有列出,主要是让大家看看Query和Criteria怎么用 首先是Query的用法: package cn.itcast.hibernate.domain; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import cn.itcast.hibernate.method.MethodManager; public class QueryTest { /** * @param args */ public static void main(String[] args) { User user = new User(); for(int i=1; i<5; i++) { user.setName("Aaron"+i); user.setBirthday(new Date()); MethodManager.addUser(user);//保存数据 } User ss = new User(); ss.setName("Aaron1"); ss.setBirthday(new Date()); MethodManager.addUser(ss); User ss1 = new User(); ss1.setName("Aaron1"); ss1.setBirthday(new Date()); MethodManager.addUser(ss1); query("Aaron1"); } @SuppressWarnings("unchecked") static void query(String userName){ Session session = null; try{ session = HibernateUtils.getSession(); String hql = "from User user where user.name = ?"; //String hql1 = "from User user where user.name.birthday is not null"; //多个属性不为空 //String hql = "from User as user where user.name = :ss"; Query query = session.createQuery(hql); query.setString(0, userName);//问号的位置从0开始 //query.setString("ss", userName);//当多个问号时,可以指定别名,这样可以防止混乱 query.setFirstResult(0);//表示从结果集的第一条记录开始 query.setMaxResults(10);//表示每次取20条记录,这样可以实现跨数据库分页 List<User> list = query.list(); /* Iterator<User> iterator = query.iterate(); while(iterator.hasNext()){ System.out.println(iterator.next().getName()); } */ //User u = (User)query.uniqueResult();//确定独一无二的结果 //System.out.println(u); /* List names = new ArrayList(); names.add("Aaron1"); names.add("Aaron2"); Query q = session.createQuery("from User user where user.name in (:naa) order by user.birthday desc"); q.setParameterList("naa", names); List<User> cats = q.list(); for(User userList : cats){ System.out.println(userList.getName()+","+userList.getBirthday()); } *///查询条件是一个集合 for(User userList : list){ System.out.println(userList.getName()+","+userList.getBirthday()); } } finally { if(session!=null) session.close();//必须关闭session } } } Criteria的用法: package cn.itcast.hibernate.domain; import java.util.Date; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import cn.itcast.hibernate.method.MethodManager; public class CriteriaQuery { /** * @param args */ public static void main(String[] args) { User user = new User(); for(int i=1; i<5; i++) { user.setName("Aaron"+i); user.setBirthday(new Date()); MethodManager.addUser(user);//保存数据 } User ss = new User(); ss.setName("Aaron1"); ss.setBirthday(new Date()); MethodManager.addUser(ss); User ss1 = new User(); ss1.setName("Aaron1"); ss1.setBirthday(new Date()); MethodManager.addUser(ss1); query("Aaron1"); } @SuppressWarnings("unchecked") static void query(String userName){ Session session = null; try{ //Criteria和Restrictions实现条件查询 session = HibernateUtils.getSession(); Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.eq("name", userName)); criteria.add(Restrictions.le("birthday", new Date()));//多个add表示与 // criteria.add(Restrictions.or(Restrictions.eq("name", userName), Restrictions.eq("name", "Aaron2")));//表示逻辑或,表示名字为Aaron和Aaron1的都查询出来 criteria.addOrder(Order.desc("id")); //按照id倒序 //criteria.setFirstResult(0); //criteria.setMaxResults(30); List<User> list = criteria.list(); for(User userList : list){ System.out.println(userList.getName()+","+userList.getBirthday()); } } finally { if(session!=null) session.close();//必须关闭session } } }
补充 :Criteria查询
经验心得:相比Hql来说,Criteria查询方式可以使程序员在不懂sql的情况下进行数据的查询操作,并且Criteria查询方式其实也有Query的同样的查询方法 如分页用到的查询方式,不过官方推荐使用HQL查询
发表评论
-
二十六 Hibernate实践
2011-07-04 19:18 740不适合OLAP以查询分析数据为主的系统。适合OLTP联机事务处 ... -
二十五 SQL和命名查询
2011-07-04 19:17 1053SQL和命名查询 SQL查询 //根据sql语句查询 s ... -
二十四 拦截器与监听器
2011-07-04 19:14 959在保存 更新等操作的前 ... -
二十三 iterate查询与N+1次查询的问题
2011-07-04 19:13 790test.java view plaincopy to ... -
二十二 Hibernate映射文件配置
2011-07-04 19:12 896id 主键生成方式 incremen ... -
二十一 串讲Hibernate配置文件中的配置项
2011-07-04 19:11 871数据源配置 ## JNDI Datasource ... -
二十 悲观锁和乐观锁
2011-07-04 19:10 746为了避免对对象同步操作时候产生的数据不一致问题,我们对对象采用 ... -
十九 hibernate3之缓存
2011-07-04 19:09 935什么是缓存?现在我们来看一个模拟的缓存操作 模拟一个缓存例子 ... -
十八 一对一对象的懒加载
2011-07-04 17:59 745一对一对象的懒加载,对于主的一方,lazy是无效的,它在访问数 ... -
十七 懒加载
2011-07-04 17:58 746十七 懒加载 什么是hibe ... -
十六 继承映射
2011-07-04 17:56 504第一种 一个员工类它有两个子类,利用hibernate我们把 ... -
十五 cascade 级联操作与inverse表是否放弃维护关联关系
2011-07-04 17:54 856cascade 级联操作字段 Casade用来说明当对主对 ... -
十四 在hibernate中使用集合总结
2011-07-04 17:52 885集合映射(set, list, array,bag, map) ... -
十三 array数组形式的映射
2011-07-04 17:51 856数组其实跟List的集合映射没有多大的差别,当然它不可以使用b ... -
十二 集合映射之Map集合
2011-07-04 17:49 818十二 Map集合映射 Map是以键值对的形式存放数据的 ... -
十一 集合映射 List集合
2011-07-04 17:47 1030十一 集合映射 set的 ... -
十 组件关联
2011-07-04 17:45 720组件关联 什么是组件关联呢?比如说一个用户,它的名称,有一 ... -
九 多对多关系 学生<--->老师的关系
2011-07-04 17:44 1250九 多对多关系 学生<--->老师的关系 多对多 ... -
八 一对一 用户与身份证的关系
2011-07-04 17:42 875八 一对一 用户与身份证的关系 设计用户实体 主实体 ... -
七 一对多关系 部门与员工的关系
2011-07-04 17:41 1142一对多 部门与员工的关系 相对于部门来说 一对多 根据先前 ...
相关推荐
学习Hibernate的HQL和Criteria API,不仅可以提高数据库操作的效率,还能更好地利用ORM的优势,减少与数据库交互的复杂度。掌握这两者,对于提升Java开发中的数据操作能力大有裨益。这份资料将帮助你深入理解这两种...
本文将基于提供的文件信息,深入探讨HQL与Criteria API在数据查询操作中的应用,并通过具体的代码示例进行对比分析。 #### 查询所有记录 **HQL:** ```java String hql = "from Employee"; List<Employee> result ...
1、掌握Hibernate框架应用项目 2、学习HQL参数查询和Criteria查询 3、比较HQL和Criteria的不同 建立web项目,通过页面查询构造动态查询语句,struts2和hibernate框架整合。
本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query Language)、Criteria API以及原生SQL。 一、HQL(Hibernate Query Language) HQL是Hibernate提供的一种面向对象的查询语言,它类似于SQL...
本文旨在为读者呈现不同的方式查询方式:HQL方式的查询、SQL原生态SQL方式的查询、以及Criteria方式的查询,拓展查询的不同实现思路,开阔视野、并涵盖了部分的Hibernate增删改的基本操作。
#### 四、HQL与Criteria API对比分析 尽管HQL和Criteria API都能实现分页功能,但两者之间还是存在一些区别: - **语法风格**:HQL更接近SQL,而Criteria API则采用了Java Bean的方式,更适合进行复杂查询条件的构建...
本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query Language)和QBC(Query By Example)。通过实例开发,我们将了解这两种查询方法的使用和它们之间的差异。 首先,HQL是Hibernate专门设计的一种...
与传统的SQL语言不同,HQL更加注重于面向对象的特性,它支持Java类名和属性名作为查询条件,使得开发者可以直接使用Java对象模型来编写查询语句,而不需要了解底层数据库的具体表结构。HQL的这种特性大大提高了代码...
与传统的SQL查询相比,Criteria查询更加面向对象,易于理解和维护。在Hibernate框架中,Criteria查询是除HQL之外的另一种常用查询方式。 #### 二、Criteria 接口 `org.hibernate.Criteria` 接口代表了针对某个特定...
**正文** ...在实际项目中,结合HQL和 Criteria 查询,以及Querydsl等工具,可以构建更加灵活和健壮的数据访问层。在进行HQL编程时,应注意避免SQL注入风险,合理使用命名参数,以确保代码的安全性。
【描述】:在ORM框架Hibernate中,数据查询和检索是一个核心功能,它提供了多种查询方式,包括标准化对象查询(Criteria Query)、Hibernate查询语言(HQL)和原生SQL查询。其中,HQL作为官方推荐的查询方式,具有...
5. **HQL与Criteria查询的比较** Hibernate还提供了Criteria API,它是另一种对象化的查询方式,更加强调代码的可读性和类型安全。虽然两者都能完成相同的工作,但根据项目需求和个人喜好,开发者可以选择更适合的...
#### QBC(Query By Criteria)与HQL对比 在NHibernate中,除了HQL之外,还提供了另一种查询方式——QBC(Query By Criteria)。QBC是一种基于API的查询构建方法,它通过一系列的API调用来构造查询条件,相比于HQL...
在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...
Hibernate Query Language(HQL)是Hibernate框架提供的一种面向对象的查询语言,它是基于Java的,但其语法与SQL类似,用于在Java应用中操作对象。HQL允许开发者用类名和属性名而不是表名和列名进行数据库查询,这...
四、HQL与SQL的映射 虽然HQL更面向对象,但仍然可以转换为SQL执行。Hibernate会自动将HQL语句转化为相应的SQL,这个过程称为查询优化。开发者可以通过开启Hibernate的日志来查看实际执行的SQL语句,以便进行性能分析...
四、HQL分组与排序 通过`group by`和`order by`关键字,HQL可以实现数据的分组和排序。例如,按照城市分组并按年龄降序排列: ```java String hql = "from User group by city order by age desc"; ``` 五、HQL子...
Criteria查询是另一种面向对象的查询方式,通过Criteria接口、Restrictions和MatchMode等工具来构建和执行查询,提供了更灵活的查询构建方式。 总之,HQL是Hibernate中强大的查询工具,它允许开发者以更符合面向...
HQL 语句是一种类似 SQL 的查询语言,用于定义查询条件和检索数据,而 Criteria API 则是一种基于对象的查询接口,用于构建查询条件和检索数据。 在本笔记中,我们将学习如何使用 Hibernate 的 Criteria API 进行...