Hibernate Data Filter Example (XML And Annotation)
In this tutorial we are going to see how can you declare and use Hibernate Data Filters. Filters are a very useful feature in Hibernate, that enables to filter your received data from the database according to a custom condition. Filters have a unique name for identification and can accept parameters and can also be used with XML mapping and Annotation mapping, as we are going to demonstrate.
So these are the tools we are going to use on a Windows 7 platform:
- JDK 1.7
- Maven 3.0.5
- Hibernate 4.2.3.Final
- MySQL JDBC driver 5.1.9
- Eclipse 4.3 Kepler
The basis of this tutorials is going to be this Eclipse project: HibernateMySQLExample.zip. And it’s based in Hibernate 3 with Maven 2 and MySQL 5 Example (XML Mapping and Annotation).
1. Hibernate Data Filter using XML mapping
Remember that the structure of the the project we are going to use is this:
Declare the filter
Open Student.hbm.xml
file and paste the following code:
Student.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.javacodegeeks.Student" table="student" catalog="tutorials"> <id name="studentId" type="java.lang.Integer"> <column name="STUDENT_ID" /> <generator class="identity" /> </id> <property name="studentName" type="string"> <column name="STUDENT_NAME" length="10" not-null="true" unique="true" /> </property> <property name="studentAge" type="string"> <column name="STUDENT_Age" length="20" not-null="true" unique="true" /> </property> <filter name="studentFilter" condition="STUDENT_ID >= :studentFilterID"/> </class> <filter-def name="studentFilter"> <filter-param name="studentFilterID" type="java.lang.Integer" /> </filter-def> </hibernate-mapping>
Enable the filter
Open App.java
file and paste the following code:
App.java:
package com.javacodegeeks; import java.util.List; import org.hibernate.Filter; import org.hibernate.Query; import org.hibernate.Session; import com.javacodegeeks.utils.HibernateUtil; public class App { public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Filter filter = session.enableFilter("studentFilter"); filter.setParameter("studentFilterID", 49); Query query = session.createQuery("from Student"); List<?> list = query.list(); for (int i = 0; i < list.size(); i++) { Student student = (Student) list.get(i); System.out.println(student); } session.getTransaction().commit(); } }
Output:
Hibernate: select student0_.STUDENT_ID as STUDENT1_0_, student0_.STUDENT_NAME as STUDENT2_0_, student0_.STUDENT_Age as STUDENT3_0_ from tutorials.student student0_ where student0_.STUDENT_ID >= ?
Student [studentId=49, studentName=JavaFun, studentAge=19]
Student [studentId=50, studentName=JavaFun, studentAge=19]
Student [studentId=51, studentName=JavaFun, studentAge=19]
Student [studentId=52, studentName=JavaFun, studentAge=19]
Student [studentId=53, studentName=JavaFun, studentAge=19]
Student [studentId=54, studentName=JavaFun, studentAge=19]
Student [studentId=55, studentName=JavaFun, studentAge=19]
Now if you comment lines 17,18 of the above code to disable the filter and run the program again these are the results:
Hibernate: select student0_.STUDENT_ID as STUDENT1_0_, student0_.STUDENT_NAME as STUDENT2_0_, student0_.STUDENT_Age as STUDENT3_0_ from tutorials.student student0_
Student [studentId=4, studentName=JavaFun, studentAge=19]
Student [studentId=5, studentName=JavaFun, studentAge=19]
Student [studentId=6, studentName=JavaFun, studentAge=19]
Student [studentId=8, studentName=James, studentAge=19]
Student [studentId=9, studentName=Akilis, studentAge=19]
Student [studentId=10, studentName=Akilis, studentAge=19]
Student [studentId=11, studentName=Jeremy, studentAge=45]
Student [studentId=12, studentName=Jeremy, studentAge=45]
Student [studentId=31, studentName=Jeremny, studentAge=21]
Student [studentId=32, studentName=JavaFun, studentAge=19]
Student [studentId=33, studentName=JavaFun, studentAge=19]
Student [studentId=34, studentName=JavaFun, studentAge=19]
Student [studentId=35, studentName=JavaFun, studentAge=19]
Student [studentId=36, studentName=JavaFun, studentAge=19]
Student [studentId=37, studentName=JavaFun, studentAge=19]
Student [studentId=38, studentName=JavaFun, studentAge=19]
Student [studentId=40, studentName=Jeremy, studentAge=21]
Student [studentId=46, studentName=JavaFun, studentAge=19]
Student [studentId=47, studentName=JavaFun, studentAge=19]
Student [studentId=48, studentName=JavaFun, studentAge=19]
Student [studentId=49, studentName=JavaFun, studentAge=19]
Student [studentId=50, studentName=JavaFun, studentAge=19]
Student [studentId=51, studentName=JavaFun, studentAge=19]
Student [studentId=52, studentName=JavaFun, studentAge=19]
Student [studentId=53, studentName=JavaFun, studentAge=19]
Student [studentId=54, studentName=JavaFun, studentAge=19]
Student [studentId=55, studentName=JavaFun, studentAge=19]
So you can see that the filter us working well. To disable the filter dynamically in your application you can simply use :
... session.disableFilter("studentFilter"); ...
Now, the filter will be disabled and your queries will return unfiltered results.
1. Hibernate Data Filter using Annotations
For this we are going to use the Eclipse project of Hibernate 3 with Maven 2 and MySQL 5 Example (XML Mapping and Annotation) that deals with Annotations. It’s right here : HibernateMySQLAnnot.zip.
Here is how to define a filter in Student.java
file:
Student.java:
package com.javacodegeeks; import static javax.persistence.GenerationType.IDENTITY; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.Filter; import org.hibernate.annotations.FilterDef; import org.hibernate.annotations.ParamDef; @Entity @FilterDef(name = "studentFilter", parameters = @ParamDef(name = "studentFilterID", type = "java.lang.Integer")) @Table(name = "student", catalog = "tutorials") @Filter(name = "studentFilter", condition = "STUDENT_ID > :studentFilterID") public class Student implements java.io.Serializable { private static final long serialVersionUID = 1L; private Integer studentId; private String studentName; private String studentAge; public Student() { } public Student(String studentName, String studentAge) { this.studentName = studentName; this.studentAge = studentAge; } @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "STUDENT_ID", unique = true, nullable = false) public Integer getStudentId() { return this.studentId; } public void setStudentId(Integer studentId) { this.studentId = studentId; } @Column(name = "STUDENT_NAME", nullable = false, length = 10) public String getStudentName() { return this.studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } @Column(name = "STUDENT_AGE", nullable = false, length = 20) public String getStudentAge() { return this.studentAge; } public void setStudentAge(String studentAge) { this.studentAge = studentAge; } @Override public String toString() { return "Student [studentId=" + studentId + ", studentName=" + studentName + ", studentAge=" + studentAge + "]"; } }
Now using the same App.java
as above these are the results:
Output:
Hibernate: select student0_.STUDENT_ID as STUDENT1_0_, student0_.STUDENT_NAME as STUDENT2_0_, student0_.STUDENT_Age as STUDENT3_0_ from tutorials.student student0_ where student0_.STUDENT_ID >= ?
Student [studentId=49, studentName=JavaFun, studentAge=19]
Student [studentId=50, studentName=JavaFun, studentAge=19]
Student [studentId=51, studentName=JavaFun, studentAge=19]
Student [studentId=52, studentName=JavaFun, studentAge=19]
Student [studentId=53, studentName=JavaFun, studentAge=19]
Student [studentId=54, studentName=JavaFun, studentAge=19]
Student [studentId=55, studentName=JavaFun, studentAge=19]
Reading the Jboss documentations is always useful. This was an example on how to use Hibernate Data Filters using both XML mapping and Annotation.