转载

Hibernate查询条件

   
Hibernate提供了操作对象,并依次数据在RDBMS表可用的备用方式。其中一个方法是标准的API,它允许你建立一个标准的查询对象编程,可以套用过滤规则和逻辑条件。

Hibernate的Session接口提供了可用于创建一个返回的持久化对象的类的实例时,应用程序执行一个条件查询一个Criteria对象createCriteria()方法。

以下是最简单的一个条件查询的例子是将简单地返回对应于Employee类的每个对象。

 Criteria cr = session.createCriteria(Employee.class); List results = cr.list();

限制与标准:

可以使用add()方法可用于Criteria对象添加限制条件查询。下面是例子增加一个限制与薪水返回的记录是等于2000:

 Criteria cr = session.createCriteria(Employee.class); cr.add(Restrictions.eq("salary", 2000)); List results = cr.list();

以下是几个例子覆盖不同的场景,并且可以根据要求使用:

 Criteria cr = session.createCriteria(Employee.class);  // To get records having salary more than 2000 cr.add(Restrictions.gt("salary", 2000));  // To get records having salary less than 2000 cr.add(Restrictions.lt("salary", 2000));  // To get records having fistName starting with zara cr.add(Restrictions.like("firstName", "zara%"));  // Case sensitive form of the above restriction. cr.add(Restrictions.ilike("firstName", "zara%"));  // To get records having salary in between 1000 and 2000 cr.add(Restrictions.between("salary", 1000, 2000));  // To check if the given property is null cr.add(Restrictions.isNull("salary"));  // To check if the given property is not null cr.add(Restrictions.isNotNull("salary"));  // To check if the given property is empty cr.add(Restrictions.isEmpty("salary"));  // To check if the given property is not empty cr.add(Restrictions.isNotEmpty("salary"));

可以创建AND或OR使用LogicalExpression限制如下条件:

 Criteria cr = session.createCriteria(Employee.class);  Criterion salary = Restrictions.gt("salary", 2000); Criterion name = Restrictions.ilike("firstNname","zara%");  // To get records matching with OR condistions LogicalExpression orExp = Restrictions.or(salary, name); cr.add( orExp );   // To get records matching with AND condistions LogicalExpression andExp = Restrictions.and(salary, name); cr.add( andExp );  List results = cr.list();

虽然上述所有条件,可以直接使用HQL在前面的教程中介绍。

分页使用标准:

还有的标准接口,用于分页的两种方法。

S.N. 方法 & 描述
1 public Criteria setFirstResult(int firstResult)
This method takes an integer that represents the first row in your result set, starting with row 0.
2 public Criteria setMaxResults(int maxResults)
This method tells Hibernate to retrieve a fixed number maxResults of objects.

采用上述两种方法一起,我们可以在我们的网站或Swing应用程序构建一个分页组件。下面是例子,可以扩展来每次获取10行:

 Criteria cr = session.createCriteria(Employee.class); cr.setFirstResult(1); cr.setMaxResults(10); List results = cr.list();

排序的结果:

标准的API提供了org.hibernate.criterion.Order类排序按升序或降序排列你的结果集,根据对象的属性。这个例子演示了如何使用Order类的结果集进行排序:

 Criteria cr = session.createCriteria(Employee.class); // To get records having salary more than 2000 cr.add(Restrictions.gt("salary", 2000));  // To sort records in descening order crit.addOrder(Order.desc("salary"));  // To sort records in ascending order crit.addOrder(Order.asc("salary"));  List results = cr.list();

预测与聚合:

该Criteria API提供了一个org.hibernate.criterion.Projections类可用于获取平均值,最大值或最小值的属性值。Projections类是类似于类限制,因为它提供了几个静态工厂方法用于获得Projection 实例。  provides the 

以下是涉及不同的方案的一些例子,可按规定使用:

 Criteria cr = session.createCriteria(Employee.class);  // To get total row count. cr.setProjection(Projections.rowCount());  // To get average of a property. cr.setProjection(Projections.avg("salary"));  // To get distinct count of a property. cr.setProjection(Projections.countDistinct("firstName"));  // To get maximum of a property. cr.setProjection(Projections.max("salary"));  // To get minimum of a property. cr.setProjection(Projections.min("salary"));  // To get sum of a property. cr.setProjection(Projections.sum("salary"));

Criteria Queries 例子:

考虑下面的POJO类:

 public class Employee {    private int id;    private String firstName;     private String lastName;       private int salary;       public Employee() {}    public Employee(String fname, String lname, int salary) {       this.firstName = fname;       this.lastName = lname;       this.salary = salary;    }    public int getId() {       return id;    }    public void setId( int id ) {       this.id = id;    }    public String getFirstName() {       return firstName;    }    public void setFirstName( String first_name ) {       this.firstName = first_name;    }    public String getLastName() {       return lastName;    }    public void setLastName( String last_name ) {       this.lastName = last_name;    }    public int getSalary() {       return salary;    }    public void setSalary( int salary ) {       this.salary = salary;    } }

让我们创建下面的EMPLOYEE表来存储Employee对象:

 create table EMPLOYEE (    id INT NOT NULL auto_increment,    first_name VARCHAR(20) default NULL,    last_name  VARCHAR(20) default NULL,    salary     INT  default NULL,    PRIMARY KEY (id) );

以下将被映射文件。

 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC   "-//Hibernate/Hibernate Mapping DTD//EN"  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">   <hibernate-mapping>    <class name="Employee" table="EMPLOYEE">       <meta attribute="class-description">          This class contains the employee detail.        </meta>       <id name="id" type="int" column="id">          <generator class="native"/>       </id>       <property name="firstName" column="first_name" type="string"/>       <property name="lastName" column="last_name" type="string"/>       <property name="salary" column="salary" type="int"/>    </class> </hibernate-mapping>

最后,我们将创建应用程序类的main()方法来运行,我们将使用Criteria查询的应用程序:

 import java.util.List;  import java.util.Date; import java.util.Iterator;    import org.hibernate.HibernateException;  import org.hibernate.Session;  import org.hibernate.Transaction; import org.hibernate.SessionFactory; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Projections; import org.hibernate.cfg.Configuration;  public class ManageEmployee {    private static SessionFactory factory;     public static void main(String[] args) {       try{          factory = new Configuration().configure().buildSessionFactory();       }catch (Throwable ex) {           System.err.println("Failed to create sessionFactory object." + ex);          throw new ExceptionInInitializerError(ex);        }       ManageEmployee ME = new ManageEmployee();        /* 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){       Session 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);           tx.commit();       }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());           }          tx.commit();       }catch (HibernateException e) {          if (tx!=null) tx.rollback();          e.printStackTrace();        }finally {          session.close();        }    }    /* Method to print total number of records */    public 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) );          tx.commit();       }catch (HibernateException e) {          if (tx!=null) tx.rollback();          e.printStackTrace();        }finally {          session.close();        }    }   /* Method to print sum of salaries */    public void totalSalary(){       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) );          tx.commit();       }catch (HibernateException e) {          if (tx!=null) tx.rollback();          e.printStackTrace();        }finally {          session.close();        }    } }

编译和执行:

下面是步骤来编译并运行上述应用程序。请确保您已在进行的编译和执行之前,适当地设置PATH和CLASSPATH。

  • 创建hibernate.cfg.xml配置文件中配置章节解释。

  • 创建Employee.hbm.xml映射文件,如上图所示。

  • 创建Employee.java源文件,如上图所示,并编译它。

  • 创建ManageEmployee.java源文件,如上图所示,并编译它。

  • 执行ManageEmployee二进制运行程序.

会得到以下结果,并记录将创建在EMPLOYEE表中。

 $java ManageEmployee .......VARIOUS LOG MESSAGES WILL DISPLAY HERE........  First Name: Daisy  Last Name: Das  Salary: 5000 First Name: John  Last Name: Paul  Salary: 5000 First Name: Mohd  Last Name: Yasee  Salary: 3000 Total Coint: 4 Total Salary: 15000

如果检查EMPLOYEE表,它应该记录如下:

 mysql> select * from EMPLOYEE; +----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 14 | Zara       | Ali       |   2000 | | 15 | Daisy      | Das       |   5000 | | 16 | John       | Paul      |   5000 | | 17 | Mohd       | Yasee     |   3000 | +----+------------+-----------+--------+ 4 rows in set (0.00 sec)  mysql>
   
正文到此结束
Loading...