hibernate查询数据库的三种方式

合集下载

hibernate三种查询使用心得

hibernate三种查询使用心得

hibernate的查询SQL,HQL,QBC。

最早接触Hibernate是在2004年,当时怀着忐忑和不安的心情来学习这门技术。

经过这几年的使用和研究,也积累了一定的经验,下面就HQL和QBC查询来谈一下我从工作中得到的一些总结。

本文不会讲什么是Hibernate、什么是ORM、更不会谈怎样使用HQL与QBC.本文的目的是让大家对平常使用最多,也是最广泛的与数据库打交道的两种方式,有一个新的认识。

恩,如果你还不知道Hibernate,大象建议你先去学一下再来看本文,如果你已经是这方面的高手,大可以关掉浏览器,千万不要因为本人的愚见,让你对大象口诛笔伐,进行人身攻击。

HQL和QBC都是查询检索的方式,最开始,我一直使用的都是HQL,因为以前一直用的都是SQL,觉得这东西和SQL差不多,上手很快。

后来又用QBC,因为QBC是基于接口和类的对象化查询,使代码变得很清晰,很整洁。

下面是查询用户表中,id为2,年龄等于21,并且名字以J开头的两种查询语句,它们的结果都是一样,只是不同的表现方式。

HQL:Query query = session.createQuery("from User u where u.id = 2 and u.age = 21 and like 'J%'");List list = query.list();QBC:Criteria criteria = session.createCriteria(User.class);List list = criteria.add(Expression.eq("id", 2)).add(Expression.eq("age", 2)).add(Expression.like("name", "J%")).list();如果查询再复杂一点,需要关联多张表,那上面这个HQL语句就会显得很复杂,比较难以阅读。

Hibernate的检索方式

Hibernate的检索方式

Hibernate的检索方式Hibernate提供以下几种检索对象的方式。

●导航对象图检索方式。

(根据已经加载的对象,导航到其他对象。

)●OID检索方式。

(按照对象的OID来检索对象。

)●HQL检索方式。

(使用面向对象的HQL查询语言。

)●QBC检索方式。

(使用QBC(Qurey By Criteria) API来检索对象。

)●本地SQL检索方式。

(使用本地数据库的SQL查询语句。

)一、Hibernate的检索方式简介1、HQL检索方式HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL 查询语言有些相识。

在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。

它具有以下功能:●在查询语句中设定各种查询条件。

●支持投影查询,即仅检索出对象的部分属性。

●支持分页查询。

●支持分组查询,允许使用having和group by关键字。

●提供内置聚集函数,如sum()、min()和mac()。

●能够调用用户定义的SQL函数。

●支持子查询,即嵌入式查询。

●支持动态绑定参数。

Session类的find方法及Qurey接口都支持HQL检索方式。

区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在将来新的Hibernate版本中,有可能淘汰find方法;而Qurey接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。

注:Qurey接口支持方法链编程风格,它的set方法都返回自身实例,而不是返回void类型。

方法链编程风格能使程序代码更加简洁。

示例代码:Query query = session.createQuery("from Customer as c where "+ "=:customerName andc.age=:customerAge"); // 动态绑定参数query.setString("customerName", "Test");query.setInteger("customerAge", 21);// 执行检索List result = query.list();// 方法链编程风格List result1 = session.createQuery("from Customer as c where =:customerName"+ " andc.age=:customerAge").setString("customerName","Test").setInteger("customerAge", 21).list();∙2、QBC(Qurey By Criteria)检索方式采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。

通常使用的Hibernate通常是三种查询及调用

通常使用的Hibernate通常是三种查询及调用

相关文章:∙SSH通用查询DAO(2)∙应用Hibernate3的DetachedCriteria实现分页查询∙基于spring与hibernate的通用分页实现推荐圈子: GT-Grid更多相关推荐通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:1、QBE(Qurey By Example)检索方式QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。

一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。

QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。

在这种情况下,还是采用HQL检索方式或QBC检索方式。

Java代码1./**2. * @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录3. * @param pageNo4. * 当前页数5. * @param pageSize6. * 每页显示的记录数7. * @param object8. * 将查询条件封装为Object9. * @return 将查询结果封装为Pager返回10. */11.public Pager findPageByExample(int pageNo, int pageSize, Objectobject)12.{13. Pager pager = null;14. try15. {16. Criteria criteria = this.getSession().createCriteria(17. Class.forName(this.getEntity()));18.19. if (object != null)20. {21. criteria.add(Example.create(object).enableLike());22. }23.24. // 获取根据条件分页查询的总行数25. int rowCount = (Integer) criteria.setProjection(26. Projections.rowCount()).uniqueResult();27. criteria.setProjection(null);28.29. criteria.setFirstResult((pageNo - 1) * pageSize);30. criteria.setMaxResults(pageSize);31.32. List result = criteria.list();33.34. pager = new Pager(pageSize, pageNo, rowCount, result);35.36. } catch (RuntimeException re)37. {38. throw re;39. } finally40. {41. return pager;42. }43.44.}注意代码的第20行,即criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。

浅谈hibernate的几个查询

浅谈hibernate的几个查询

一、load和get方法的区别1、load在查询时,先从一级缓存中寻找与数据索引对应的实体对象,然后构建并返回一个代理对象,当我们真正使用这个代理对象的时候,这时候才会进入二级缓存查找或到数据库加载数据,如果数据库中没有找到则抛出一个ObjectNotFoundException;2、get方法在查询时,同样是先从一级缓存中寻找与数据索引对应的实体对象,如果有则直接返回该实体对象,如果没有则马上进入二级缓存查找或到数据库加载数据,查找到则直接返回查询对象,没有则返回一个null;二、list和iterator1 、list方法会直接直接到数据库中加载数据,然后将查询结果放入缓存中,当然如果你配置了查询缓存,他会先进入查询缓存寻找,如果没有满足条件的再进入数据库加载数据;2、iterator方法在查询时是先从数据库中查询出所有满足条件的数据索引,然后再根据这些数据索引进入一级和二级缓存进行匹配,如果对于数据索引有实体对象则直接返回该对象,如果没有则在具体使用对象的时候才会进入数据库加载数据,并且把数据索引和对于实体对象放进缓存;3、什么时候使用最合适呢?个人建议第一次查询使用list直接从数据库中读取所有数据,然后放到了缓存中,后面使用Iterator,直接从缓存中读取,利于提高性能;三、延迟加载1、对于load方法,它在查询对象的时候始终返回的一个代理对象,那么为什么hibernate要引入这么一个方式呢,为什么不像get方法一样直接返回查询对象呢?出于对hibernate的性能考虑,hibernate则提出了一个解决方案,那就是延迟加载,这里load方法的使用则正是实体对象延迟加载的表现。

2、hibernate中list和Iterator 区别,延迟加载对于Query接口的list()和Iterator()方法来说,都可以实现获取查询的对象,但是list() 方法返回的是每一个对迪昂都是完整的(对象的每一个属性都被表中的字段填充上了),而Iterator()方法返回的对象中仅包含了主键值(标识符),只有当你对Iterator中的对象进行操作时,Hibernate才会向数据库发送SQL语句来获取属性值。

Hibernate查询详解

Hibernate查询详解

Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。

load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。

get():如果在数据库中没有记录会返回空,get()无论如何都会返回数据.load():如果数据库中没有记录会抛出异常,如果有数据返回的是一个代理对象。

list和iterator()方法之间的区别:(N+1?)list()方法在执行时,直接运行查询结果所需要的查询语句。

iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。

因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).结果集的处理方法不同:list()方法会一次活的所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。

如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。

iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。

一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。

HQL:HQL是一种面向对象的查询语言,HQL的操作对象是类、实例和属性等。

SQL:sql的操作对象是数据表和列等数据对象。

Hql是完全面向对象的查询语言,因此可以支持继承和多条等特征。

HQL查询依赖于Query类,每个Query实例对应一个查询对象。

定参数的功能,Query 接口才是真正的HQL查询接口。

//创建一个Query 对象Java代码1Query query = session.createQuery ("from Customer as c where=:customerName and c.age=:customerAge");//动态绑定参数Java代码2query.setString("customerName","Tom");3query.setInteger("customerAge",21);//执行查询语句,返回结果Java代码4List result = query.list();HQL查询步骤:1:获取Hibernate Session对象。

hibernate高级查询

hibernate高级查询

1.将数据部署完成2.通过session完成删除,更新,增加,获取,查询使用session接口: CUD时比较方便.get,loadHibernate的另外的查询方式:1.HQL : Hibernate Query Language2.QBC : Query by Creteria3.SQL3.任务: 通过向导的方式,为fwxx项目添加hibernate框架组件.然后定制映射关联关系.5分钟一,HQL查询1.使用步骤1).得到session 2).使用Query接口的CreateQuery编写HQL语句进行查询3).通过Query接口的方法处理结果示例1: 查询所有的房屋信息:Session session = HibernateSessionFactory.getSession();Query q = session.createQuery("from FWXX "); //此时可以省略等同于“select fwxx from FWXX fwxx “ <select * from tbl_Fwxx>,返回FWXX对象集合List<FWXX> list =q.list();for(FWXX fwxx :list){System.out.println(fwxx);}session.close();示例2: 如果需要查询指定的列时,采用以下代码Query q = session.createQuery("select fwxx.title,fwxx.datefrom FWXX as fwxx "); //FWXX 是类名而不是表的名字 ; as fwxx为该类的对象所起的别名 ; fwxx.title,fwxx.date为 FWXX类的属性名//如果指定了查询对象的列,注意返回的是一个Object数组的形势表示的数据.Iterator it =q.iterate();while(it.hasNext()){Object[] row = (Object[]) it.next();System.out.println(row[0]+"\t"+row[1]);}示例3: HQL条件查询1).支持like,in,> ,>= ,<= ,< between ,not in,2).参数查询,支持”?”,Query q = session.createQuery("select fwxx.fwxx,fwxx.datefrom FWXX as fwxx where fwxx.fwxx like ?");q.setString(0, "%"+fwxx+"%");List objects =q.list();3).定制参数名: 使用”:”+参数名称.Query q = session.createQuery("from FWXX as fwxx where fwxx.zjbetween :zj1 and :zj2"); //q.setDouble("zj1",minZj);q.setDouble("zj2",maxZj);System.out.println(q.getQueryString());//执行的HQL语句查询租金范围在800到2000之间,并且标题包含健翔桥的房屋信息示例4:HQL关联查询查询联系人是”伊先生”的房屋信息发布在那些街道SQL: select*from tbl_fwxx as fw ,tbl_jd as jd wherefw.jdid=jd.jdid and fw.lxr ='伊先生'HQL:select jd from FWXX fwxx ,JD jd where fwxx.jdid=jd.jdid and fwxx.lxr=’伊先生’常见错误:.hibernate.QueryException: could not resolve property:jd of: com.accp.fwxx.entity.FWXX [select jd fromcom.accp.fwxx.entity.FWXX fwxx ,com.accp.fwxx.entity.JDjd where fwxx.jd=jd and fwxx.lxr='伊先生']原因: FWXX类的jd属性实际为JD. 注意,如果出现了该类型不存在的属性(包含属性的大小写错误),会引发该异常.2.由于sql错误引发的异常,注意Caused by部分的错误提示Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute queryat ...Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'’' 附近有语法错误。

Hibernate查询3

Hibernate查询3

• 查询没有员工的部门
> String hql=‚from Dept as d where d.employees is
empty‛
• 关联查询
> 隐式内连接,join,left join,right join
• 查询编号为” 1”的部门下面所有的员工(隐式)
> String hql="select emp from Dept as d,Employee emp
where d.deptId = emp.dept.deptId anห้องสมุดไป่ตู้ d.deptId = 1 “
• 查询编号为” 1”的部门下面所有的员工(join)
> String hql=“select emp from Dept as d join d.employees
emp where d.deptId = 1“
• 注意
> > > >
[]中的内容可以省略 MappedObject为Hibernate已经加载的映射对象 查询条件,排序使用的都是对象的属性 返回包含MappedObject的List集合
• 完成业务:使用HQL语句查询编号为001的员工信 息
• 查询所有担任保安职责的员工信息
> Hql:“from Employee as emp where
查 > query.setMaxResult(endIndex)//endIndex:往后面查几条
Hibernate的优缺点
• Hibernate的优点:
> > > > >
用OOP的数据库访问方式 屏蔽底层数据访问的差异 数据访问代码开发较率高 开放源代码、参考文档详细 使用方便、容易上手

在Java的Hibernate框架中对数据库数据进行查询操作

在Java的Hibernate框架中对数据库数据进行查询操作

这篇文章主要介绍了Java的Hibernate框架中对数据库数据进行查询操作的方法,Hibernate 是Java的SSH三大web开发框架之一能列表:DISTINCT关键字只计算在该行设定的唯一值。

下面的查询将只返回唯一的计数:最后,我们将创建应用程序类的main()方法来运行,我们将使用Criteria查询的应用程序:?1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829 importjava.util.List;importjava.util.Date;importjava.util.Iterator;importorg.hibernate.HibernateException;importorg.hibernate.Session;importorg.hibernate.Transaction;importorg.hibernate.SessionFactory;importorg.hibernate.Criteria;importorg.hibernate.criterion.Restrictions;importorg.hibernate.criterion.Projections;importorg.hibernate.cfg.Configuration;publicclassManageEmployee {privatestaticSessionFactory factory;publicstaticvoidmain(String[] args) {try{factory = newConfiguration().configure().buildSessionFactory();}catch(Throwable ex) {System.err.println("Failed to create sessionFactory object."+ ex);thrownewExceptionInInitializerError(ex);}ManageEmployee ME = newManageEmployee();/* Add few employee records in database */Integer empID1 = ME.addEmployee("Zara", "Ali", 2000);Integer empID2 = ME.addEmployee("Daisy", "Das", 5000);Integer empID3 = ME.addEmployee("John", "Paul", 5000);Integer empID4 = ME.addEmployee("Mohd", "Yasee", 3000);/* List down all the employees */ME.listEmployees();/* Print Total employee's count */ME.countEmployee();/* Print Toatl salary */ME.totalSalary();}/* Method to CREATE an employee in the database */public Integer addEmployee(String fname, String lname, int salary){30313233343536373839404142434445464748495051525354555657585960Session session = factory.openSession();Transaction tx = null;Integer employeeID = null;try{tx = session.beginTransaction();Employee employee = new Employee(fname, lname, salary);employeeID = (Integer) session.save(employee);mit();}catch (HibernateException e) {if (tx!=null) tx.rollback();e.printStackTrace();}finally {session.close();}return employeeID;}/* Method to READ all the employees having salary more than 2000 */ public void listEmployees( ){Session session = factory.openSession();Transaction tx = null;try{tx = session.beginTransaction();Criteria cr = session.createCriteria(Employee.class);// Add restriction.cr.add(Restrictions.gt("salary", 2000));List employees = cr.list();for (Iterator iterator =employees.iterator(); iterator.hasNext();){ Employee employee = (Employee) iterator.next();System.out.print("First Name: " + employee.getFirstName());System.out.print(" Last Name: " + employee.getLastName());System.out.println(" Salary: " + employee.getSalary());}mit();}catch (HibernateException e) {if (tx!=null) tx.rollback();e.printStackTrace();}finally {session.close();}}/* Method to print total number of records */61626364656667686970717273747576777879808182838485868788899091public void countEmployee(){Session session = factory.openSession();Transaction tx = null;try{tx = session.beginTransaction();Criteria cr = session.createCriteria(Employee.class);// To get total row count.cr.setProjection(Projections.rowCount());List rowCount = cr.list();System.out.println("Total Coint: " + rowCount.get(0) );mit();}catch (HibernateException e) {if (tx!=null) tx.rollback();e.printStackTrace();}finally {session.close();}}/* Method to print sum of salaries */publicvoidtotalSalary(){Session session = factory.openSession();Transaction tx = null;try{tx = session.beginTransaction();Criteria cr = session.createCriteria(Employee.class);// To get total salary.cr.setProjection(Projections.sum("salary"));List totalSalary = cr.list();System.out.println("Total Salary: "+ totalSalary.get(0) );mit();}catch(HibernateException e) {if(tx!=null) tx.rollback();e.printStackTrace();}finally{session.close();}}}。

Hibernate查询

Hibernate查询

Hibernate的查询语言:1.Native SQL:本地语言(数据库自己的SQL语句)功能强大,2.HQL Hibernate Query Language(更灵活,推荐) 条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象.3.QBC(Query By Criteria) 查询方式这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections.Hibernate Query Language:HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作。

而且HQL是面向对象的,具备继承,多态和关联等特性。

from子句:from子句是最简单的HQL,例如from Student,也可以写成select s from Student s。

它简单的返回Student 类的所有实例。

值得注意的是除了JAVA类和属性的名称外,HQL语句对大小写不敏感。

select子句:有时并不需要取得对象的所有属性,这时可以使用select子句进行属性查询,如select from Student s带where条件的查询:where子句:HQL也支持子查询,它通过where子句实现这一机制。

where子句可以让用户缩小要返回的实例的列表范围。

例如下面语句会返回所有名字为"Bill"的Student实例:Query query = session.createQuery("from Student as s where ='Bill'");where子句允许出现的表达式包括了SQL中可以使用的大多数情况。

数学操作:+,-,*,/真假比较操作:=, >=, <=, <>, !=, like逻辑操作:and ,or, not字符串连接:||排序:order by连接查询与SQL一样,HQL也支持连接查询,如内连接,外连接和交叉连接:inner join:内连接left outer join:左外连接right outer join:右外连接full join:全连接,但不常用//sql写 select ... From 表1 inner join 表2 on 表1.列=表2.列注意join 后写一个的前面实体类别名.属性名可以使用冒号(:),作为占位符,来接受参数使用。

Hibernate查询方式

Hibernate查询方式

Hibernate查询方式总的来说共有三种:HQL、QBC和SQL三种。

但是细分可以有如下几种:一、HQL查询方式这一种比较常用,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。

条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。

其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。

注意:在hql中关键字不区分大小写,但是属性和类名区分大小写示例1: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<Admin> list=query.list();for(Admin admin:list){System.out.println(admin.getAname());}}finally{if(s!=null)s.close();}}----对于多对一关系查询:String hql = "from Student where Class.className = '二班'";(Student实体类中含有Class对象的引用。

这样相当于两张表的联合查询)示例2(分页查询):Query query = session.createQuery("from Customer corder by asc");query.setFirstResult(0);query.setMaxResults(10);List result = query.list();说明:–setFirstResult(int firstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0。

Hibernate的批量查询

Hibernate的批量查询

Hibernate的批量查询Hibernate的查询⼤致分为以下三种场景, 1. HQL查询-hibernate Query Language(多表查询,但不复杂时使⽤) 2. Criteria查询(单表条件查询) 3. 原⽣SQL查询(复杂的业务查询)接下来解释三种使⽤⽅法:1.HQL查询-hibernate Query Language(多表查询,但不复杂时使⽤) Hibernate独家查询语⾔,属于⾯向对象的查询语⾔,HQL语⾔中不会出现SQL中的表和列,HQL使⽤的都是JavaBean的类名和属性名。

1.HQL基本查询(1)查询所有的基本语句@Test// HQL查询所有数据public void fun1() {// 1 获得sessionSession session = HibernateUtil.openSession();// 2.书写HQL语句String hql = "from cn.qlq.domain.Customer";// from 类名全路径// 3.根据hql创建查询对象Query query = session.createQuery(hql);// 4.根据查询对象获取查询结果List<Customer> customers = query.list();System.out.println(customers);}结果:Hibernate:selectcustomer0_.cust_id as cust_id1_0_,customer0_.cust_name as cust_nam2_0_,customer0_.cust_source as cust_sou3_0_,customer0_.cust_industry as cust_ind4_0_,customer0_.cust_level as cust_lev5_0_,customer0_.cust_linkman as cust_lin6_0_,customer0_.cust_phone as cust_pho7_0_,customer0_.cust_mobile as cust_mob8_0_fromcst_customer customer0_[Customer [cust_id=1, cust_name=XXXXXXXXXX], Customer [cust_id=2, cust_name=联想]]改进:如果整个项⽬中只有⼀个类的名字可以省略包路径,也就是可以只写类名:@Test// HQL查询所有数据public void fun1() {// 1 获得sessionSession session = HibernateUtil.openSession();// 2.书写HQL语句// String hql = "from cn.qlq.domain.Customer";// from 类名全路径String hql = "from Customer";// 如果整个项⽬中只有这⼀个类名可以直接写名字// 3.根据hql创建查询对象Query query = session.createQuery(hql);// 4.根据查询对象获取查询结果List<Customer> customers = query.list();System.out.println(customers);}(2)根据主键查询单个@Test// HQL查询单个数据public void fun2() {// 1 获得sessionSession session = HibernateUtil.openSession();// 2.书写HQL语句// String hql = "from cn.qlq.domain.Customer";// from 类名全路径String hql = "from Customer where cust_id = 1";// where后⾯是Customer的属性名称⽽不是列名}2.HQL条件查询:(1)?占位符查询 类似于JDBC的占位符,只是hibernate的?下标从0开始,⽽JDBC的下标从1开始,基本上所有的编程索引都从0开始,唯独JDBC从1开始。

简述hibernate查询数据库的步骤

简述hibernate查询数据库的步骤

简述hibernate查询数据库的步骤Hibernate是Java中最流行的ORM(Object Relational Mapping)框架之一,它可以使Java开发者更加方便地操作数据库。

Hibernate查询数据库的步骤主要包括以下几个方面:1.创建SessionFactorySessionFactory是Hibernate的核心接口,它负责创建Session对象,也就是数据库连接。

在创建SessionFactory时,需要指定数据库连接信息、实体类映射信息等。

2.创建SessionSession是与数据库交互的核心接口,它负责打开、关闭数据库连接,并提供了各种方法来执行CRUD操作。

在使用Session之前,需要通过SessionFactory获取一个Session对象。

3.构建查询语句Hibernate支持HQL(Hibernate Query Language)和SQL两种查询语言。

HQL是一种面向对象的查询语言,它将实体类和属性映射到关系型数据库中的表和列上。

SQL则直接使用SQL语句来查询数据库。

4.执行查询执行查询有两种方式:一种是通过Query对象执行HQL或SQL语句;另一种是通过Criteria对象进行条件查询。

Query对象可以执行任意复杂度的HQL或SQL语句,并返回结果集;Criteria对象则提供了更加灵活和安全的条件查询方式。

5.处理结果集无论采用哪种方式进行查询,都会返回一个结果集。

对于单条记录或单个值的查询可以直接使用uniqueResult()方法获取结果;对于多条记录的查询,则需要遍历结果集进行处理。

以上就是Hibernate查询数据库的主要步骤。

在实际应用中,还需要注意事务的处理、查询性能的优化等问题。

Hibernate提供了丰富的API和工具来帮助开发者更加方便地操作数据库。

Hibernate —— HQL、QBC检索方式

Hibernate —— HQL、QBC检索方式

Hibernate ——HQL、QBC检索方式一、HQL 检索方式以双向的一对多来测试HQL 检索方式。

以Department 和Employee 为例。

建表语句:CREATE TABLE department(dept_id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,dept_name VARCHAR(50));CREATE INDEX FK_8hf3vewo7w3v9doungcc51wwy ON department (dept_id);复制代码CREATE TABLE employee(emp_id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,emp_name VARCHAR(50),salary FLOAT,dept_id_fk INT(11),CONSTRAINT FK_miun1wlqp4ujpsgfshyfi7g9j FOREIGN KEY (dept_id_fk) REFERENCES department (dept_id) );CREATE INDEX FK_miun1wlqp4ujpsgfshyfi7g9j ON employee (dept_id_fk);复制代码对应的实体和hbm 文件public class Department {private Integer deptId;private String deptName;private Set<Employee> emps = new HashSet<>();}public class Employee {private Integer empId;private String empName;private Float salary;private Department dept;}Department.hbm.xmlEmployee.hbm.xml1.在查询语句中设定各种查询条件复制代码@Testpublic void testHql(){Department dept = new Department();dept.setDeptId(7);List<Employee> list = session.createQuery("FROM Employee e where e.empName like ? and e.empId > ? and dept = ? order by e.empId " + "desc ").setString(0, "%b%").setInteger(1, 3).setEntity(2, dept).list();for(Employee employee : list) {System.out.println(employee);}}复制代码说明:(1)通过Session 的createQuery(hql) 方法创建一个Query 对象,hql 支持动态绑定参数。

hibernate查询数据库返回一条数据的方法

hibernate查询数据库返回一条数据的方法

hibernate查询数据库返回一条数据的方法Hibernate 是一个强大的对象关系映射(ORM)框架,它简化了Java 程序与数据库之间的交互。

在本文中,我们将探讨使用Hibernate 查询数据库并返回一条数据的方法。

### Hibernate 查询数据库返回一条数据的方法在Hibernate 中,查询数据库并返回一条数据通常有多种方式。

下面列举了几种常用的方法:#### 1.使用HQL(Hibernate Query Language)```java// 获取Hibernate 会话Session session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();// 使用HQL 查询String hql = "FROM YourEntityName where someColumn = :value";Query query = session.createQuery(hql);query.setParameter("value", someValue);// 获取唯一结果Object result = query.uniqueResult();mit();session.close();// 输出结果if (result != null) {YourEntity entity = (YourEntity) result;// Do something with the entity}```注意:这里的`YourEntityName` 替换为你的实体类名,`someColumn` 和`someValue` 替换为你需要查询的列名和值。

#### 2.使用Criteria API```javaSession session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();// 创建Criteria 对象Criteria criteria = session.createCriteria(YourEntityName.class);criteria.add(Restrictions.eq("someColumn", someValue));// 获取唯一结果Object result = criteria.uniqueResult();mit();session.close();// 输出结果if (result != null) {YourEntity entity = (YourEntity) result;// Do something with the entity```#### 3.使用Native SQL```javaSession session = sessionFactory.openSession();Transaction transaction = session.beginTransaction();// 使用原生SQL 查询String sql = "SELECT * FROM your_table WHERE some_column = :value";SQLQuery query = session.createSQLQuery(sql);query.setParameter("value", someValue);// 指定返回的实体类query.addEntity(YourEntityName.class);// 获取唯一结果Object result = query.uniqueResult();mit();session.close();// 输出结果if (result != null) {YourEntity entity = (YourEntity) result;// Do something with the entity}注意:在使用Native SQL 时,确保你了解原生SQL 语句的数据库依赖性。

Hibernate的查询方式

Hibernate的查询方式

Sql、Criteria,object comptositionHql:1、属性查询2、参数查询、命名参数查询3、关联查询4、分页查询5、统计函数6.如何优化Hibernate?1.使用双向一对多关联,不使用单向一对多2.灵活使用单向一对多关联3.不用一对一,用多对一取代4.配置对象缓存,不使用集合缓存5.一对多集合使用Bag,多对多集合使用Set6. 继承类使用显式多态7. 表字段要少,表关联不要怕多,有二级缓存撑腰1.Hibernate有哪几种查询数据的方式(1)导航对象图查询(2)OID查询(3)HQL(4)QBC(5)本地SQL2.load()和get()的区别load加载方法:Java代码Users user = (Users)session.load(Users.class, userId);Users user = (Users)session.load(Users.class, userId);get加载方法:Java代码Users user = (Users)session.get(Users.class, userId);Users user = (Users)session.get(Users.class, userId);两加载方法区别:区别1:如果数据库中,没有userId的对象。

如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;区别2:load支持延迟加载,get不支持延迟加载。

也就是说:Java代码Users user = (Users)session.load(Users.class, userId);Users user = (Users)session.load(Users.class, userId);这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

JavaWeb_(Hibernate框架)Hibernate中数据查询语句SQL基本用法

JavaWeb_(Hibernate框架)Hibernate中数据查询语句SQL基本用法

JavaWeb_(Hibernate框架)Hibernate中数据查询语句SQL基本⽤法本⽂展⽰三种在Hibernate中使⽤SQL语句进⾏数据查询基本⽤法 1、基本查询 2、条件查询 3、分页查询package com.Gary.dao;import java.util.List;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.query.NativeQuery;import er;import com.Gary.utils.HibernateUtils;public class SQLDao {public void find(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user";//创建sql查询对象NativeQuery query = session.createSQLQuery(sql);query.addEntity(User.class);//接收listList<User> list = query.list();//接收单⼀返回值 query.uniqyeResult();//输出第⼀个成员姓名System.out.println(list.get(0).getUsername());//结束SQL查询mit();session.close();}//SQL条件查询public void find2(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user where id = ?";//创建SQL查询对象NativeQuery query = session.createSQLQuery(sql);//封装参数,给第⼀个?赋值query.setParameter(1, "1");query.addEntity(User.class);//唯⼀返回值User user = (User) query.uniqueResult();System.out.println(user);//结束SQL查询mit();session.close();}//SQL分页查询public void find3(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user limit ? , ?";//创建SQL查询对象NativeQuery query = session.createSQLQuery(sql);//封装参数,给第⼀个?赋值query.setParameter(1, 0);//同理query.setParameter(2, 2);query.addEntity(User.class);//唯⼀返回值List<User> list = query.list();System.out.println(list.get(0).getUsername());//结束SQL查询mit();session.close();}}SQLDao.java 数据库user表 向数据库中添加假数据1、SQL基本查询 //开始进⾏SQL查询 String sql = "select * from user"; //创建sql查询对象 NativeQuery query = session.createSQLQuery(sql); query.addEntity(User.class); SQLDao.java向数据库发起查询请求public void find(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user";//创建sql查询对象NativeQuery query = session.createSQLQuery(sql);query.addEntity(User.class);//接收listList<User> list = query.list();//接收单⼀返回值 query.uniqyeResult();//输出第⼀个成员姓名System.out.println(list.get(0).getUsername());//结束SQL查询mit();session.close();}package com.Gary.dao;import java.util.List;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.query.NativeQuery;import er;import com.Gary.utils.HibernateUtils;public class SQLDao {public void find(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user";//创建sql查询对象NativeQuery query = session.createSQLQuery(sql);query.addEntity(User.class);//接收listList<User> list = query.list();//接收单⼀返回值 query.uniqyeResult();//输出第⼀个成员姓名System.out.println(list.get(0).getUsername());//结束SQL查询mit();session.close();}}SQLDao.java2、SQL条件查询//开始进⾏SQL查询String sql = "select * from user where id = ?";//创建SQL查询对象NativeQuery query = session.createSQLQuery(sql);//封装参数,给第⼀个?赋值query.setParameter(1, "1");query.addEntity(User.class); SQLDao.java向数据库发起查询请求public void find2(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user where id = ?";//创建SQL查询对象NativeQuery query = session.createSQLQuery(sql);//封装参数,给第⼀个?赋值query.setParameter(1, "1");query.addEntity(User.class);//唯⼀返回值User user = (User) query.uniqueResult();System.out.println(user);//结束SQL查询mit();session.close();}package com.Gary.dao;import java.util.List;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.query.NativeQuery;import er;import com.Gary.utils.HibernateUtils;public class SQLDao {public void find(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user";//创建sql查询对象NativeQuery query = session.createSQLQuery(sql);query.addEntity(User.class);//接收listList<User> list = query.list();//接收单⼀返回值 query.uniqyeResult();//输出第⼀个成员姓名System.out.println(list.get(0).getUsername());//结束SQL查询mit();session.close();}public void find2(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user where id = ?";//创建SQL查询对象NativeQuery query = session.createSQLQuery(sql);//封装参数,给第⼀个?赋值query.setParameter(1, "1");query.addEntity(User.class);//唯⼀返回值User user = (User) query.uniqueResult();System.out.println(user);//结束SQL查询mit();session.close();}}SQLDao.java3、SQL分页查询 //开始进⾏SQL查询 String sql = "select * from user limit ? , ?"; //创建SQL查询对象 NativeQuery query = session.createSQLQuery(sql); //封装参数,给第⼀个?赋值 query.setParameter(1, 0); //同理 query.setParameter(2, 2); query.addEntity(User.class); //唯⼀返回值 List<User> list = query.list(); SQLDao.java向数据库发起查询请求//SQL分页查询public void find3(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user limit ? , ?";//创建SQL查询对象NativeQuery query = session.createSQLQuery(sql);//封装参数,给第⼀个?赋值query.setParameter(1, 0);//同理query.setParameter(2, 2);query.addEntity(User.class);//唯⼀返回值List<User> list = query.list();System.out.println(list.get(0).getUsername());//结束SQL查询mit();session.close();}package com.Gary.dao;import java.util.List;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.query.NativeQuery;import er;import com.Gary.utils.HibernateUtils;public class SQLDao {public void find(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user";//创建sql查询对象NativeQuery query = session.createSQLQuery(sql);query.addEntity(User.class);//接收listList<User> list = query.list();//接收单⼀返回值 query.uniqyeResult();//输出第⼀个成员姓名System.out.println(list.get(0).getUsername());//结束SQL查询mit();session.close();}//SQL条件查询public void find2(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user where id = ?";//创建SQL查询对象NativeQuery query = session.createSQLQuery(sql);//封装参数,给第⼀个?赋值query.setParameter(1, "1");query.addEntity(User.class);//唯⼀返回值User user = (User) query.uniqueResult();System.out.println(user);//结束SQL查询mit();session.close();}//SQL分页查询public void find3(){Session session = HibernateUtils.getSession();Transaction beginTransaction = session.beginTransaction();//开始进⾏SQL查询String sql = "select * from user limit ? , ?";//创建SQL查询对象NativeQuery query = session.createSQLQuery(sql);//封装参数,给第⼀个?赋值query.setParameter(1, 0);//同理query.setParameter(2, 2);query.addEntity(User.class);//唯⼀返回值List<User> list = query.list();System.out.println(list.get(0).getUsername());//结束SQL查询mit();session.close();}}SQLDao.java。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hibernate查询数据库的三种方式一、Hibernate的HQL与SQL查询1.Hql(Hibernate Query Language)是面向对象的查询查询方式,HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,提供了类似标准SQL语句的查询方式,同时也提供了面向对象的封装。

HQL查询语句from关键字后面跟的类名+类对象,where后用对象的属性做条件;示例代码:(User是映射数据库的一个类)public boolean checkUser(UserForm userForm){//TODO Auto-generated method stub//String HQLString="from User u whereername='"+userForm.getUsername()+"'";String HQLString="from User u where ername=:uname";Session session=HibernateSessionFactory.currentSession();//获取事务session.beginTransaction();Query query=session.createQuery(HQLString);query.setParameter("uname",userForm.getUsername());//绑定参数Object list=query.list().get(0);//list获取数据集,get获取数据集的某条记录//提交事务session.getTransaction().commit();//关闭SessionHibernateSessionFactory.closeSession();User user=(User)list;if(user.getPassword().equals(userForm.getPassword())){return true;}else{return false;}}2.sql是面向数据库表查询,from后面跟的是表名,where后用表中字段做条件;示例代码:([xxdb].[dbo].[student]就是要查询的数据库表)public boolean checkUser(UserForm userForm){//TODO Auto-generated method stub//String SQLString="select*from[xxdb].[dbo].[student]u whereerName='"+userForm.getUsername()+"'";String SQLString=”select*from[xxdb].[dbo].[student]u whereerName=:uname”;Session session=HibernateSessionFactory.currentSession();session.beginTransaction();//Query query=session.createSQLQuery(SQLString).addEntity(User.class);//实体查询Query query=session.createSQLQuery(SQLString).addScalar("userid",StandardBasicTypes.INTEGER).addScalar("username",StandardBasicTypes.STRING).addScalar("password",StandardBasicTypes.STRING).addScalar("gender",StandardBasicTypes.INTEGER);//标量查询query.setParameter("uname",userForm.getUsername());//绑定参数Object list=query.list().get(0);//list获取数据集,get获取数据集的某条记录session.getTransaction().commit();HibernateSessionFactory.closeSession();User user=(User)list;if(user.getPassword().equals(userForm.getPassword())){return true;}else{return false;}}3.对比hql和sql查询方式我们可以发现他们之间的不同:a.首先是查询语句的不同,hql语句from后面跟的类名+类对象,where后用对象的属性做条件,而sql语句from后面跟的是表名,where后用表中字段做条件,这也就是面向对象和面向数据库的一个区别。

(上面例子中的User类映射的就是数据库中的[xxdb].[dbo].[student]表);b.创建查询对象的方法有所不同,hql是creatQuery,而sql是creatSQLQuery;c.Hql可以省略select关键字而sql不能省略。

4.hql和sql查询语句原则上都可以用拼接的方式书写查询条件,但为了为了防止SQL注入漏洞的产生一般用参数绑定的方式,参数绑定的方式有多种:按参数名称绑定query.setString(“uname”,“老谢”),按参数位置绑定query.setString(0,”laoxie”),setParameter()方法,setProperties()方法,setProperties方法命名参数与一个对象的属性值绑定在一起,如下程序代码:User user=new User();user.setUserName(“谢谢”);user.setGender(“1”);Query query=session.createQuery(from user u where ername=:name and u.gender=:gender);query.setProperties(user);setProperties()方法会自动将user对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。

二、Hibernate条件查询使用Hibernate时,即使不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询,org.hibernate.Criteria对SQL进行封装,可以从Java物件的观点来组合各种查询条件,由Hibernate自动产生SQL语句,而不用特别管理SQL与数据库相依的问题。

Criteria criteria=session.createCriteria(User.class);List users=criteria.list();for(Iterator it=users.iterator();it.hasNext();){User user=(User)it.next();System.out.println(user.getId()+"/t"+user.getName()+"/"+user.getAge());}Criteria建立后,若不给予任何的条件,预设是查询物件所对应表格之所有记录,设定档中设定了Hibernate的”show_sql”属性,则可以在主控下看到以下的SQL语句之产生:Hibernate:select this_.id as id0_0_,this_.name as name0_0_,this_.age as age0_0_from T_USER this_;Criteria基本查询条件设定,使用org.hibernate.Criteria的add()方法加入这些条件实例,例如查询”age”大于20且小于40的资料:Criteria criteria=session.createCriteria(User.class);criteria.add(Restrictions.gt("age",new Integer(20)));criteria.add(Restrictions.lt("age",new Integer(40)));Restrictions的gt()方法表示大于(great than)的条件,而lt表示小于(less than)的条件;Restrictions的几个常用限定查询方法如下所示:方法说明Restrictions.eq等于Restrictions.allEq使用Map,使用key/value进行多个等于的比对Restrictions.gt大于>Restrictions.ge大于等于>=Restrictions.lt小于<Restrictions.le小于等于<=Restrictions.between对应SQL的BETWEEN子句Restrictions.like对应SQL的LIKE子句Restrictions.in对应SQL的in子句Restrictions.and and关系Restrictions.or or关系排序您可以使用Criteria进行查询,并使用org.hibernate.criterion.Order对结果进行排序,例如使用Oder.asc(),指定根据”age”由小到大排序(反之则使用desc()):Criteria criteria=session.createCriteria(User.class);criteria.addOrder(Order.asc("age"));限定查询记录数Criteria的setMaxResults()方法可以限定查询回来的记录数,如果配合setFirstResult()设定传回查询结果第一条记录的位置,就可以实现简单的分页,例如传回第51条之后的50条记录如果有的话):Criteria criteria=session.createCriteria(User.class);criteria.setFirstResult(51);criteria.setMaxResults(50);统计动作您可以对查询结果进行统计动作,使用org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min()、countDistinct()等方法,再搭配Criteria的setProjection()方法加入条件设定,例如对查询结果的"age"作平均:Criteria criteria=session.createCriteria(User.class);criteria.setProjection(Projections.avg("age"));分组还可以配合Projections的groupProperty()来对结果进行分组,例如以"age"进行分组,也就是如果资料中"age"如果有20、20、25、30,则以下会显示20、25、30:Criteria criteria=session.createCriteria(User.class);criteria.setProjection(Projections.groupProperty("age"));List users=criteria.list();上面的程式将由Hibernate自动产生SQL的group by子句进行分组计算:Hibernate:select this_.age as y0_from T_USER this_group by this_.age结论Hibernate的Criteria API可以让你使用物件的方式,组合出查询数据库的条件,Hibernate会自动依你所使用的数据库,动态产生SQL语句,让你的应用程式在存取数据库时,不致于因撰写了特定的SQL而相依于特定的数据库,如果你不熟悉SQL语句的撰写,也可以试着使用Criteria来解决查询数据库的需求。

相关文档
最新文档