Hibernate 标准示例教程
欢迎使用Hibernate Criteria示例教程。
今天,我们将研究Hibernate 中的条件。
Hibernate 标准
在大多数情况下,我们使用HQL来查询数据库并获取结果。
HQL不是更新或者删除值的首选方法,因为这样我们就需要注意表之间的任何关联。
Hibernate Criteria API提供了面向对象的方法来查询数据库并获取结果。
我们无法使用Hibernate中的条件来运行更新或者删除查询或者任何DDL语句。
Hibernate Criteria查询仅用于使用面向对象方法从数据库中获取结果。
对于我的Hibernate标准示例,我将使用与我的HQL示例相同的设置,并向您展示如何在Hibernate中使用Criteria来查询数据库。
Hibernate Criteria API的一些常见用法是:
Hibernate Criteria API提供了Projection,我们可以将其用于聚合函数,例如sum(),min(),max()等。
Hibernate Criteria API可以与ProjectionList一起使用,以仅获取选定的列。
Hibernate中的条件可以通过联接多个表来用于联接查询,Hibernate条件联接的有用方法是createAlias(),setFetchMode()和setProjection()
Hibernate API中的条件可用于获取有条件的结果,有用的方法是add(),我们可以其中添加限制。
Hibernate Criteria API提供了addOrder()方法,可用于对结果进行排序。
下面的类展示了Hibernate Criteria API的不同用法,其中大多数是HQL教程中示例的替代。
package com.theitroad.hibernate.main; import java.util.Arrays; import java.util.List; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.criterion.Order; import org.hibernate.criterion.ProjectionList; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import com.theitroad.hibernate.model.Employee; import com.theitroad.hibernate.util.HibernateUtil; public class HibernateCriteriaExamples { @SuppressWarnings("unchecked") public static void main(String[] args) { //Prep work SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = sessionFactory.getCurrentSession(); Transaction tx = session.beginTransaction(); //Get All Employees Criteria criteria = session.createCriteria(Employee.class); List<Employee> empList = criteria.list(); for(Employee emp : empList){ System.out.println("ID="+emp.getId()+", Zipcode="+emp.getAddress().getZipcode()); } //Get with ID, creating new Criteria to remove all the settings criteria = session.createCriteria(Employee.class) .add(Restrictions.eq("id", new Long(3))); Employee emp = (Employee) criteria.uniqueResult(); System.out.println("Name=" + emp.getName() + ", City=" + emp.getAddress().getCity()); //Pagination Example empList = session.createCriteria(Employee.class) .addOrder(Order.desc("id")) .setFirstResult(0) .setMaxResults(2) .list(); for(Employee emp4 : empList){ System.out.println("Paginated Employees::"+emp4.getId()+","+emp4.getAddress().getCity()); } //Like example empList = session.createCriteria(Employee.class) .add(Restrictions.like("name", "%i%")) .list(); for(Employee emp4 : empList){ System.out.println("Employees having 'i' in name::"+emp4.getName()+","+emp4.getAddress().getCity()); } //Projections example long count = (Long) session.createCriteria(Employee.class) .setProjection(Projections.rowCount()) .add(Restrictions.like("name", "%i%")) .uniqueResult(); System.out.println("Number of employees with 'i' in name="+count); //using Projections for sum, min, max aggregation functions double sumSalary = (Double) session.createCriteria(Employee.class) .setProjection(Projections.sum("salary")) .uniqueResult(); System.out.println("Sum of Salaries="+sumSalary); //Join example for selecting few columns criteria = session.createCriteria(Employee.class, "employee"); criteria.setFetchMode("employee.address", FetchMode.JOIN); criteria.createAlias("employee.address", "address"); //inner join by default ProjectionList columns = Projections.projectionList() .add(Projections.property("name")) .add(Projections.property("address.city")); criteria.setProjection(columns); List<Object[]> list = criteria.list(); for(Object[] arr : list){ System.out.println(Arrays.toString(arr)); } //Rollback transaction to avoid messing test data tx.commit(); //closing hibernate resources sessionFactory.close(); } }
当我们执行上面的Hibernate Criteria示例程序时,我们得到以下输出。
Jan 26, 2014 6:53:32 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final} Jan 26, 2014 6:53:32 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {4.3.5.Final} Jan 26, 2014 6:53:32 PM org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found Jan 26, 2014 6:53:32 PM org.hibernate.cfg.Environment buildBytecodeProvider INFO: HHH000021: Bytecode provider name : javassist Jan 26, 2014 6:53:32 PM org.hibernate.cfg.Configuration configure INFO: HHH000043: Configuring from resource: hibernate.cfg.xml Jan 26, 2014 6:53:32 PM org.hibernate.cfg.Configuration getConfigurationInputStream INFO: HHH000040: Configuration resource: hibernate.cfg.xml Jan 26, 2014 6:53:32 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity WARN: HHH000223: Recognized obsolete hibernate namespace https://hibernate.sourceforge.net/. Use namespace https://www.hibernate.org/dtd/instead. Refer to Hibernate 3.6 Migration Guide! Jan 26, 2014 6:53:32 PM org.hibernate.cfg.Configuration doConfigure INFO: HHH000041: Configured SessionFactory: null Hibernate Configuration loaded Hibernate serviceRegistry created Jan 26, 2014 6:53:32 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!) Jan 26, 2014 6:53:32 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB] Jan 26, 2014 6:53:32 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH000046: Connection properties: {user=hyman, password=} Jan 26, 2014 6:53:32 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH000006: Autocommit mode: false Jan 26, 2014 6:53:32 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure INFO: HHH000115: Hibernate connection pool size: 20 (min=1) Jan 26, 2014 6:53:32 PM org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect Jan 26, 2014 6:53:32 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4 Jan 26, 2014 6:53:32 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) Jan 26, 2014 6:53:32 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> INFO: HHH000397: Using ASTQueryTranslatorFactory Hibernate: select this_.emp_id as emp_id1_1_1_, this_.emp_name as emp_name2_1_1_, this_.emp_salary as emp_sala3_1_1_, address2_.emp_id as emp_id1_0_0_, address2_.address_line1 as address_2_0_0_, address2_.city as city3_0_0_, address2_.zipcode as zipcode4_0_0_ from EMPLOYEE this_ left outer join ADDRESS address2_ on this_.emp_id=address2_.emp_id ID=1, Zipcode=95129 ID=2, Zipcode=95051 ID=3, Zipcode=560100 ID=4, Zipcode=100100 Hibernate: select this_.emp_id as emp_id1_1_1_, this_.emp_name as emp_name2_1_1_, this_.emp_salary as emp_sala3_1_1_, address2_.emp_id as emp_id1_0_0_, address2_.address_line1 as address_2_0_0_, address2_.city as city3_0_0_, address2_.zipcode as zipcode4_0_0_ from EMPLOYEE this_ left outer join ADDRESS address2_ on this_.emp_id=address2_.emp_id where this_.emp_id=? Name=Lisa, City=Bangalore Hibernate: select this_.emp_id as emp_id1_1_1_, this_.emp_name as emp_name2_1_1_, this_.emp_salary as emp_sala3_1_1_, address2_.emp_id as emp_id1_0_0_, address2_.address_line1 as address_2_0_0_, address2_.city as city3_0_0_, address2_.zipcode as zipcode4_0_0_ from EMPLOYEE this_ left outer join ADDRESS address2_ on this_.emp_id=address2_.emp_id order by this_.emp_id desc limit ? Paginated Employees::4,New Delhi Paginated Employees::3,Bangalore Hibernate: select this_.emp_id as emp_id1_1_1_, this_.emp_name as emp_name2_1_1_, this_.emp_salary as emp_sala3_1_1_, address2_.emp_id as emp_id1_0_0_, address2_.address_line1 as address_2_0_0_, address2_.city as city3_0_0_, address2_.zipcode as zipcode4_0_0_ from EMPLOYEE this_ left outer join ADDRESS address2_ on this_.emp_id=address2_.emp_id where this_.emp_name like ? Employees having 'i' in name::David,Santa Clara Employees having 'i' in name::Lisa,Bangalore Hibernate: select count(*) as y0_ from EMPLOYEE this_ where this_.emp_name like ? Number of employees with 'i' in name=2 Hibernate: select sum(this_.emp_salary) as y0_ from EMPLOYEE this_ Sum of Salaries=1000.0 Hibernate: select this_.emp_name as y0_, address1_.city as y1_ from EMPLOYEE this_ inner join ADDRESS address1_ on this_.emp_id=address1_.emp_id [hyman, San Jose] [David, Santa Clara] [Lisa, Bangalore] [Hyman, New Delhi] Jan 26, 2014 6:53:32 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]
由于我使用的是HQL示例项目,因此您需要导入该项目,然后添加此类以使其正常工作。