HQL基礎彙總

一、HQL簡介

HQL全稱是Hibernate Query Language。是一種面向對象(核心)的查詢語言。SQL的操作對象是數據列、表等數據庫數據,而HQL操作的是類、實例、屬性。

 

二、HQL使用

1、實體查詢form子句

如果from前面沒有指定select內容,就是將整個User對象取出,封裝到結果Query中。如果是得到單個結果,通過query.uniqueResult();方法得到;如果是多個結果,就會封裝到List中,可以用query.list();來得到。

 

public List<User> getAllUsers(){

                //from子句

                Session session = new HibernateSessionFactory().getSession();

                String hql = "from com.demo.bean.User"//select * from user;

                Query query = session.createQuery(hql); 

                List<User> list = query.list()//list方法,將查詢結果封裝到List中,然後返回

                return list;

}

 

2、條件子句 where

例如:"form User u  where u.id = 1 " = "select * form user where id = 1"

 

3、按屬性查詢

(1)查詢出一個String/或者其他類型的屬性,會封裝爲List<Object>

        public List<String> getAllUsernames(){

                Session session = new HibernateSessionFactory().getSession();

                String hql = "select u.username from User as u where status = 0"//select * from user;

                Query query = session.createQuery(hql); 

                List<String> list = query.list()//返回出的List對象中,封裝的對象的類型,看具體的情況而定的

                return list;

        }

 

(2)查詢多個屬性,會將屬性封裝爲對象數組所組成的List<Object[]>

//一行記錄(一組姓名和年齡)就是List中的一個元素,每個List的元素是一個Object[]來記錄各種信息

                

        public List<Object[]> getAllUsernamesAndAge(){

                Session session = new HibernateSessionFactory().getSession();

                String hql = "select u.username,u.age from User as u where status = 0"

                Query query = session.createQuery(hql); 

                List<Object[]> list = query.list()//查詢多個屬性,將多個屬性值封裝爲對象數組組成的List

                return list;

        }

        public static void main(String[] args) {

                UserDaoImpl ud = new UserDaoImpl();

                

                List<Object[]> list = ud.getAllUsernamesAndPassword();

                for(Object[] u : list){

                        System.out.println((String)u[0]);

                        System.out.println((Integer)u[1]);

                }

(3)查詢多個屬性,將得到的屬性再次封裝成對象,要求恰好有合適的構造函數,而且不要忘記給實體類加上空構造函數

 

        public List<User> getAllUsernamesAndAge(){

                Session session = new HibernateSessionFactory().getSession();

                //要求User恰好有u.username,u.age兩個屬性所構成的構造函數

                String hql = "select new User(u.username,u.age) from User as u where status = 0";

                Query query = session.createQuery(hql); 

                List<User> list = query.list()//查詢多個屬性,將多個屬性值封裝爲對象數組組成的List

                return list;

        }

 

public class User {

        private Integer id//最好用Integer而不用int作爲Identifier

        private String username;

        private String password;

        private int age;

        private int status;

        

        public User(){  //不要忘記給實體類加上空構造函數

                

        }

        public User(String username,int age){

                this.username=username;

                this.age=age;

        }

 

四、使用統計函數

String hql = "select count(*) from User where status = 0";

String hql = "select min(u.age) from User as u where status = 0";

String hql = "select count(*),min(u.age) from User as u where status = 0";

 

 

//查詢出單個統計函數的值,結果存入query中,可以用uniqueResult()得到結果對象。

public void getSomeInfo1(){

                Session session = new HibernateSessionFactory().getSession();        

                String hql = "select count(*) from User as u where status = 0";

                Query query = session.createQuery(hql); 

                //List<Object[]> list = query.list();  //查詢多個屬性,將多個屬性值封裝爲對象數組組成的List

                Object o  = query.uniqueResult();

                System.out.println((Integer)o);

        }

 

 

//同時查詢多個統計函數的值,結果封裝到List<Object[]>中,需要用query.list()方法得到結果list,然後取出第一個元素。第一個元素就是Object[],Object[0]和Object[1]分別是我們需要的信息

        public void getSomeInfo(){

                Session session = new HibernateSessionFactory().getSession();

                

                String hql = "select count(*),min(u.age) from User as u where status = 0";

                Query query = session.createQuery(hql); 

                

                List<Object[]> list = query.list();

                Object [] o = list.get(0);

                System.out.println(o[0]);

                System.out.println(o[1]);

        }        

 

Hql同樣支持sql中的一些原生函數,比如upper(將結果全部大寫),distinct(username),過濾掉重複字段 等

 

五、分組和排序

String hql = “select u.username form User as u order by u.age desc”  按年齡的降序排列取出姓名

String hql =”select count(user),user.age from User  group by age”; 

String hql =”select count(user),age from User group by age having count(user)>3”;

 

六、實體更新和刪除

對數據庫的修改操作,注意需要事務來實現

1、有條件刪除

String hql = "delete from User where age<15";

 

        public void delSome(){

                Session session = new HibernateSessionFactory().getSession();

                String hql = "delete from User where age<15";

                Query query = session.createQuery(hql); 

                Transaction tr = session.beginTransaction();

                query.executeUpdate();

                tr.commit();

                session.close();

        }        

 

2、有條件的更新

        public void updateSome(){

                Session session = new HibernateSessionFactory().getSession();

                String hql = "update User set username='tom' where id=2";

                Query query = session.createQuery(hql); 

                Transaction tr = session.beginTransaction();

                query.executeUpdate();

                tr.commit();

                session.close();

        }

 

七、參數綁定

1、順序佔位符:用?來代表參數,用query.setXxx(0, ??); 給參數賦值,參數的序號從0開始

 

        public void updateSome(String username,int id){

                Session session = new HibernateSessionFactory().getSession();

                String hql = "update User set username=? where id=?";

                Query query = session.createQuery(hql);

                query.setString(0, username);  //參數的序號從0開始

                query.setInteger(1, id);

                Transaction tr = session.beginTransaction();

                query.executeUpdate();

                tr.commit();

                session.close();

        }

 

2、引用佔位符:用“:佔位字符串”實現

 

        public User getOneUser(String username,String password){

                String hql = "from User where username=:username and password =:password";

                Session session = new HibernateSessionFactory().getSession();

                Query query = session.createQuery(hql);

                query.setString("username", username);

                query.setString("password", password);

                User u = (User) query.uniqueResult();

                return u;

        }

 

八、派生列處理

查詢一些統計信息還可以使用派生列的方式來實現:

例:經常需要得到User的人數

步驟1、將人數count屬性放入User對象,但是user表中沒有count列。

 

public class User {

        private Integer id//最好用Integer而不用int作爲Identifier

        private String username;

        private String password;

        private int age;

        private int status;

        

        private int count//記錄人數,這個屬性在數據表中沒有對應的列

        public int getCount() {

                return count;

        }

        public void setCount(int count) {

                this.count = count;

        }

 

 

步驟2、配置User.hbm.xml

加上<property name="count" formula="(select count(*) from user)"></property>,在此處設置一個子查詢,將查詢結果,注入count屬性

 

<?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="com.demo.bean.User"  lazy="false" table="user">

                <id name="id" column="id">

                        <generator class="native"></generator>

                </id>

                <property name="username"></property>

                <property name="password"></property>

                <property name="age"></property>

                <property name="status"></property>

                <property name="count" formula="(select count(*) from user)"></property>

        </class>

</hibernate-mapping>

 

步驟3、獲得人數的值

先獲得User對象,通過User對象的getCount方法獲得人數

        public static void main(String[] args) {

                UserDaoImpl ud = new UserDaoImpl();

                User u = ud.getOneUser();

                System.out.println(u.getCount());

        }

個人網站已經更新:www.stopping.top歡迎來訪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章