一、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歡迎來訪