- <span style="font-size:24px;color:#3366ff;">本文章實現HQL的如下功能:</span>
- </span>
首先要配置Hibernate的xml文件,讓兩個數據庫創建聯繫,是一對多的映射鏈接html
Employee.hbm.xmljava
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- <hibernate-mapping>
- <class name="star.july.d_hql.Employee" table="employee">
- <id name="id">
- <generator class="native"></generator>
- </id>
- <property name="name"></property>
- <property name="gender"></property>
- <property name="title"></property>
- <property name="email"></property>
- <property name="salary"></property>
- <many-to-one name="dept"
- class="star.july.d_hql.Dept"
- column="deptId"
- ></many-to-one>
- </class>
- </hibernate-mapping>
Dept.hbm.xml數據庫
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
- <hibernate-mapping>
- <class name="star.july.d_hql.Dept" table="dept">
- <id name="id">
- <generator class="native"></generator>
- </id>
- <property name="deptName" column="name">
- </property>
- <set name="employee"
- cascade="all"
- >
- <key column="id"></key>
- <one-to-many class="star.july.d_hql.Employee"
- />
- </set>
- </class>
- </hibernate-mapping>
再創建兩個實體類數組
Employee.javasession
- package star.july.d_hql;
-
- public class Employee {
- private int id;
- private String name;
- private String gender;
- private String title;
- private String email;
- private double salary;
- private Dept dept = new Dept();
-
- public Dept getDept() {
- return dept;
- }
- public void setDept(Dept dept) {
- this.dept = dept;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getGender() {
- return gender;
- }
- public void setGender(String gender) {
- this.gender = gender;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public double getSalary() {
- return salary;
- }
- public void setSalary(double salary) {
- this.salary = salary;
- }
- @Override
- public String toString() {
- return "Employee [id=" + id + ", name=" + name + ", gender=" + gender
- + ", title=" + title + ", email=" + email + ", salary="
- + salary + "]";
- }
-
-
- }
Dept.javaapp
- package star.july.d_hql;
-
- import java.util.HashSet;
- import java.util.Set;
-
- public class Dept {
- private int id;
- private String deptName;
- private Set<Employee> employee = new HashSet<Employee>();
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getDeptName() {
- return deptName;
- }
- public void setDeptName(String deptName) {
- this.deptName = deptName;
- }
- public Set<Employee> getEmployee() {
- return employee;
- }
- public void setEmployee(Set<Employee> employee) {
- this.employee = employee;
- }
-
-
- }
最後測試HQL:ide
Demo.java函數
- package star.july.d_hql;
-
- import java.util.List;
- import java.util.Set;
-
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import org.junit.Test;
-
- import star.july.util.HibernateUtil;
- public class Demo {
- @Test
- public void test(){
- Session session = HibernateUtil.getSession();
- Transaction ts = session.getTransaction();
- try{
- ts.begin();
-
-
-
- String hql = "select e from Employee e where id = 1";
- Query query = session.createQuery(hql);
-
-
- List<Employee> emp = query.list();
- for(Employee e : emp){
- System.out.println(e);
- }
-
-
- Employee empl = (Employee)query.uniqueResult();
- System.out.println(empl);
-
- ts.commit();
-
- }catch(Exception e){
- e.printStackTrace();
- ts.rollback();
- }
- }
-
-
-
- @Test
- public void test3(){
- Session session = HibernateUtil.getSession();
- Transaction ts = session.getTransaction();
- try{
- ts.begin();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- String hql = "select e from Employee e where e.gender is not null and e.gender<>'' group by e.gender having count(e.gender)>1";
-
- Query query = session.createQuery(hql);
-
-
-
- List<Object> e = query.list();
- for(Object emp : e){
- System.out.println(emp);
- }
-
-
-
-
-
-
-
-
-
-
-
- ts.commit();
- }catch(Exception e){
- e.printStackTrace();
- ts.rollback();
- }
- }
-
-
-
- @Test
- public void test2(){
- Session session = HibernateUtil.getSession();
- Transaction ts = session.getTransaction();
- try{
- ts.begin();
-
-
-
-
-
-
-
-
-
-
-
- String hql = "select d.deptName, e.name from Dept d left outer join d.employee e";
-
-
- Query query = session.createQuery(hql);
-
-
-
- List<Object[]> objects = query.list();
- for(Object[] object:objects){
- for(Object obj : object){
- System.out.print(obj);
- }
- System.out.println();
- }
-
-
-
-
- ts.commit();
-
- }catch(Exception e){
- e.printStackTrace();
- ts.rollback();
- }
- }
- }
Hibernate主要支持兩種查詢方式:HQL查詢和Criteria查詢。前者應用較爲廣發,後者也只是調用封裝好的接口。
如今有一個問題,就是實現多表鏈接查詢,且查詢結果集不與任何一個實體類對應,怎麼解決呢?
舉個例子:
如今有兩個表,一個users用戶表, 一個goods商品表,每一個用戶能夠有多個商品,而一個商品只能對應一個用戶。
users表中的字段:userId,userName,telephone,address
goods表中的字段:goodsId,goodsName,userId
如今要實現兩錶鏈接查詢,查出每一個用戶所擁有的商品,並把該用戶的信息和其商品信息顯示出來。
使用Hibernate反向生成的實體類分別是Users和Goods。
有兩種方式:
(1)使用傳統方式:
String hql="select u.userName, u.telephone, u.address, g.goodsName from Users u, Goods g where u.userId=g.userId";
根據這個查詢語句,調用query.list()方法獲得一個List值,這個List中的每個值都是Object[]類型的,裏面包含了查詢出來的全部值,剩下的自個兒去處理就好了
例如:須要將查詢的結果集 進行一下轉換:post
List stuList = scoreService.findAllScore(queryScore, null); // 返回的結果集
if(stuList != null && stuList.size()>0){
list = new LinkedList();
StudentScore st;
for(int i = 0; i < stuList.size();i++){
st = new StudentScore();
Object[] object = (Object[])stuList.get(i);// 每行記錄不在是一個對象 而是一個數組
String userId = (String)object[0];
String username = (String)object[1];
String truename = (String)object[2];
String sex = (String)object[3];
String idnum = (String)object[4];
String level = (String)object[5];
Double sumScore = Double.parseDouble(String.valueOf(object[6]));
String paperId = (String)object[7];
// 從新封裝在一個javabean裏面
st.setUserId(userId);
st.setUsername(username);
st.setTruename(truename);
st.setIdnum(idnum);
st.setLevel(DictSwitch.getValue("DICT_LEVEL",level));
st.setSex(DictSwitch.getValue("DICT_SEX",sex));
st.setPaperId(paperId);
st.setSumScore(sumScore);
st.setExamplace(DictSwitch.getValue("DICT_EXAMSTATION",examplace));
list.add(st); // 最終封裝在list中 傳到前臺。
}測試
(2)增長一個映射類
增長一個映射類UsersVoGoods.java,添加須要查詢的信息相關的全部屬性,本例中添加userName, telephone, address, goodsName。併爲這幾個屬性添加setter和getter方法,增長構造函數,參數與這四個屬性對應,那麼能夠用hql查詢方式:
String hql = "select new com.test.UsersVoGoods(u.userName, u.teltphone, u.address, g.goodsName) from Users u, Goods g where u.userId=g.userId";
query.list()的返回值List中的值都是UsersVoGoods型的,直接使用get()就能獲取。
其實不增長映射類也是能夠的,只須要在Users.java實體類裏增長一個構造函數,函數參數仍是須要的全部字段,併爲這些參數中Users實體原來沒有的字段添加屬性和getter() setter()便可。