Hibernate Query Language
Query q =session.createQuery("from Categoryc orderby c.name desc"); List<Category> categories =(List<Category>)q.list();
HQL語言大小寫不敏感,但是涉及到Java類名、package名、屬性名稱時,大小寫敏感
可以使用冒號(:),作為預留位置,來接受參數使用。如下(鏈式編程)
Query q=session.createQuery("from Category c wherec.id > :min and c.id <:max") .setInteger("min", 2) .setInteger("max", 8);
或
Query q=session.createQuery("from Category c wherec.id > :min and c.id <:max") .setParameter("min", 2) .setParameter("max", 8);List<Category> categories= (List<Category>)q.list();
或者使用問號作為預留位置
Query q=session.createQuery("from Category c where c.id = ? and c.name = ? ");q.setInteger(0,12);q.setString(1”名稱”);
分頁查詢
Query q=session.createQuery("from Category c orderby c.name desc"); q.setMaxResults(4);//每頁顯示的最大記錄數 q.setFirstResult(2);//從第幾條開始顯示,從0開始 List<Category> categories =(List<Category>)q.list();
當返回的執行個體明確只有一個或者為null的時候可以使用uniqueResult方法查詢,當返回的執行個體大於一個的時候的拋出NonUniqueResultException
String hql="from User u where u.id=?"; User user = (User)session.createQuery(hql).setString(0,id).uniqueResult();
查詢部分屬性(返回Object []數組)
List arr=newArrayList(); try { String hql="select s.SName,s.SSex fromStu as s"; Query query=this.GetSession().createQuery(hql); List list=query.list(); Iterator iter=list.iterator(); while(iter.hasNext()){ Object[] obj=(Object[]) iter.next(); Stu s=new Stu(); s.setSName(obj[0].toString()); s.setSSex(obj[1].toString()); arr.add(s); } } catch (HibernateException e) { this.CloseSession(); }
根據主鍵查詢
Stu stu=(Stu)this.GetSession().get(Stu.class, id);
模糊查詢
public List getallQueryLike(String name){ List arr=null; try { String hql="from Stu as s wheres.SName like :name"; Query query=this.GetSession().createQuery(hql); query.setString("name","%"+name+"%"); // %必須寫在參數裡,而不能卸載SQL語句中 //錯誤寫法:query.setString("name","'%"+name+"%'"); arr=query.list(); } catch (HibernateException e) { throw e; }finally{ this.CloseSession(); } return arr;}
返回List類型
List<List> list2 =session.createQuery("select newList(c.name,c.mother,c.createDate) from ……").list();for(List row :list2){ for(Object obj : row){ System.out.println(obj); }}
返回Map類型
List listMap =session.createQuery("select new Map(c.nameas name,c.mother as mother,c.createDate as createDate) from ……").list();for(Map map :(List<Map>) listMap){ System.out.println(map.get(name)); System.out.println(map.get(mother)); System.out.println(map.get(createDate));}
返回Java實體物件
List<Cat> catList = session.createQuery("select newCat(cat.name,Cat.createDate) from Cat c").list();
跨表查詢
List<Event> eventList = session.createQuery("select e from Event e where e.cat.name = 'ketty'").list();
表面上只查詢了Event表,實際上因為where子句用到了e.cat.name,將會查詢Event表與Cat表
HQL中的join只能用在一對一、一對對、多對一、多對多等屬性上,如果兩個實體間沒有任何關係,則不能用join。猶豫一對一、一對對、多對一、多對多等屬性已經聲明了外鍵串連條件,因此在HQL中的join 也不需要使用on指明串連條件,例如
select d,e fromDepartment d inner join d.employees e
employees是Department中的集合屬性
Query by Criteria
QBC(Query ByCriteria)查詢方式是Hibernate提供的“更加物件導向”的一種檢索方式。QBC在條件查詢上比HQL查詢更為靈活,而且支援運行時動態產生查詢語句。
在Hibernate應用中使用QBC查詢通常經過3個步驟
(1)使用Session執行個體的createCriteria()方法建立Criteria對象
(2)使用工具類Restrictions的相關方法為Criteria對象設定查詢對象
(3)使用Criteria對象的list()方法執行查詢,返回查詢結果
Criteria c=session.createCriteria(Topic.class) .add(Restrictions.gt("id",2)) .add(Restrictions.lt("id",8)) .add(Restrictions.like("title", "t_")) .createCriteria("category") .add(Restrictions.between("id", 3, 5)) ;List list =c.list();
= Restrictions.eq() 等於
<> Restrictions.not(Exprission.eq()) 不等於
> Restrictions.gt() 大於
>= Restrictions.ge() 大於等於
< Restrictions.lt() 小於
<= Restrictions.le() 小於等於
is null Restrictions.isnull() 等於空值
is not null Restrictions.isNotNull() 非空值
like Restrictions.like() 字串模式比對
and Restrictions.and() 邏輯與
and Restrictions.conjunction() 邏輯與
or Restrictions.or() 邏輯或
or Restrictions.disjunction() 邏輯或
not Restrictions.not() 邏輯非
in(列表) Restrictions.in() 等於列表中的某一個值
ont in(列表) Restrictions.not(Restrictions.in())不等於列表中任意一個值
between x andy Restrictions.between() 閉區間xy中的任意值
not between xand y Restrictions.not(Restrictions..between()) 小於值X或者大於值y
工具類Order提供設定排序方式
Order.asc(StringpropertyName) 升序排序
Order.desc(StringpropertyName) 降序排序
工具類Projections提供對查詢結果進行統計與分組操作
Porjections.avg(StringpropertyName) 求某屬性的平均值
Projections.count(StringpropertyName) 統計某屬性的數量
Projections.countDistinct(StringpropertyName) 統計某屬性的不同值的數量
Projections.groupProperty(StringpropertyName) 指定一組屬性值
Projections.max(StringpropertyName) 某屬性的最大值
Projections.min(StringpropertyName) 某屬性的最小值
Projections.projectionList() 建立一個新的projectionList對象
Projections.rowCount() 查詢結果集中記錄的條數
Projections.sum(StringpropertyName) 返回某屬性值的合計
複合查詢就是在原有的查詢基礎上再進行查詢。例如在顧客對定單的一對多關聯性中,在查詢出所有的顧客對象後,希望在查詢定單中money大於1000的定單對象。
Session session= HibernateSessionFactory.getSessionFactory().openSession();Transaction ts =session.beginTransaction();Criteria cuscriteria =session.createCriteria(Customer.class);Criteria ordCriteria =cusCriteria.createCriteria("orders");ordCriteria.add(Restrictions.gt("money",new Double(1000))); Iterator it =cusCriteria.list().iterator();ts.commit();HibernateSessionFactory.closeSession();
離線查詢又叫DetachedCriteria查詢,它可以在 Session 之外進行構造,只有在需要執行查詢時才與 Session 綁定。
Query By Example
QBE查詢就是檢索與指定樣本對象具有相同屬性值的對象。因此QBE查詢的關鍵就是樣本對象的建立,樣本對象中的所有非空屬性均將作為查詢條件。QBE查詢的功能子集,雖然QBE沒有QBC功能大,但是有些場合QBE使用起來更為方便。
工具類Example為Criteria對象指定樣本對象作為查詢條件
Customer c = newCustomer();c.setCname("Hibernate"); Criteria criteria = session.createCriteria(Customer.class);Criteria.add(Example.create(c)); Iterator it =criteria.list().iterator();
Native SQL
Session s =HibernateUtil.getSession(); Query q = s.createSQLQuery("select *from user").addEntity(User.class); List<User> rs = q.list();
addEntity代表以某種實體類的形式返回List列表
命名查詢
Query q =s.getNamedQuery("getUserById"); q.setInteger("id", id);
註解方式
@NamedQuery(name= "all cat" ,query ="select * from Cat c")@NamedNativeQuery(name= "all cat" ,query ="select * from tb_cat ")
配置方式
<hibernate-mapping> <class name="com.sy.vo.User" table="user" catalog="news"> …… </class> <!-- 命名查詢:定義查詢條件 --> <query name="getUserById"> <![CDATA[from User where id=:id]]> </query> <!-- 命名查詢中使用sql,不推薦使用,影響跨資料庫--> <sql-query name="getUserById2"> <![CDATA[select * from User where]]> </sql-query> --></hibernate-mapping>