HQL:Hibernate Query LanguageHQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。HQL查询依赖于Query类,每个Query实例对应一个查询对象,使用HQL查询按如下步骤进行:(1)获取Hibernate Session对象;(2)编写HQL语句;(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;(4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值;(5)调用Query对象的list等方法遍历查询结果。查询示例:public class HqlQuery...{ public static void main(String[] args) throws Exception ...{ HqlQuery mgr = new HqlQuery(); //调用查询方法 mgr.findPersons(); //调用第二个查询方法 mgr.findPersonByHappenDate(); HibernateUtil.sessionFactory.close(); } //第一个查询方法 private void findPersons() ...{ //获得Hibernate Session Session sess = HibernateUtil.currentSession(); //开始事务 Transaction tx = sess.beginTransaction(); //以HQL语句创建Query对象 //执行setString方法为HQL语句的参数赋值 //Query调用list方法访问查询的全部实例 List p1 = sess.createQuery("from Person p where o.myEvents.title = : eventTitle").setString("eventTitle", "很普通事情").list(); //遍历查询的全部结果 for (Iterator pit = p1.iterator(); pit.haxNext(); ) ...{ Person p = (Person)pit.next(); System.out.println(p.getName()); } //提交事务 tx.commit(); HibernateUtil.closeSession(); } //第二个查询方法 private void findPersonByHappenDate() throws Exception ...{ Session sess = HibernateUtil.currentSession(); Transaction tx = sess.beginTransaction(); //解析出Date对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date start = sdf.parse("2007-11-27"); System.out.println("系统开始通过日期查找人" + start); //通过Session的createQuery方法创建Query对象 //设置参数 //返回结果集 List pl = sess.createQuery( "from Person p where p.myEvents.happenDate between :firstDate and :endDate") .setDate("firstDate", start) .setDate("endDate", new Date()) .list(); //遍历结果集 for (Iterator pit = pl.iterator(); pit.hasNext(); ) ...{ Person p = (Person)pit.next(); System.out.println(p.getName()); } tx.commit(); HibernateUtil.closeSession(); }}$下面介绍HQL语句的语法1.from子句from Person表明从Person持久化类中选出全部的实例。推荐:from Person as p2.select子句select p.name from Person as pselect p.name.firstName from Person as pselect new list(p.name, p.address) from Person as pselect new ClassTest(p.name, p.address) from Person as p (有前提)select p.name as personName from Person as pselect new map(p.name as personName) from Person as p (与new map()结合更普遍)3.聚集函数avg,count,max,min,sumselect count(*) from Personselect max(p.age) from Person as pselect p.name || "" || p.address from Person as p4.多态查询from Person as pfrom java.lang.Object ofrom Named as n5.where子句from Person where name like "tom%"from Person as p where p.name like "tom%"from Cat cat where cat.mate.name like "kit%" select * from cat_table as table1 cat_table as table2 where table1.mate = table2.id and table1.name like "kit%"from Foo foo where foo.bar.baz.customer.address.city like "fuzhou%"from Cat cat, Cat rival where cat.mate = rival.mateselect cat, matefrom Cat cat, Cat matewhere cat.mate = matefrom Cat as cat where cat.id = 123from Cat as cat where cat.mate.id = 69from Person as personwhere person.id.country = 'AU' and person.id.medicareNumber = 123456from Account as accountwhere account.owner.id.country = 'AU' and account.owner.id.medicareNumber = 123456from Cat cat where cat.class = DomesticCatfrom Account as a where a.person.name.firstName like "dd%" // 正确from Account as a where a.person.name like "dd%" // 错误6.表达式from DomesticCat cat where cat.name between 'A' and 'B'from DomesticCat cat where cat.name in ('Foo', 'Bar', 'Baz')from DomesticCat cat where cat.name not between 'A' and 'B'from DomesticCat cat where cat.name not in ('Foo', 'Bar', 'Baz')from DomesticCat cat where cat.name is nullfrom Person as p where p.address is not null<property name="hibernate.query.substitutions">true 1, false 0</property>from Cat cat where cat.alive = truefrom Cat cat where cat.kittens.size > 0from Cat cat where size(cat.kittens) > 0from Calendar cal where maxelement(cal.holidays) > current datefrom Order order where maxindex(order.items) > 100from Order order where minelement(order.items) > 10000//操作集合元素select mother from Cat as mother, Cat as kitwhere kit in elements(foo.kittens)//p的name属性等于集合中某个元素的name属性select p from NameList list, Person pwhere p.name = some elements(list.names)//操作集合元素from Cat cat where exists elements(cat.kittens)from Player p where 3 > all elements(p.scores)from Show show where 'fizard' in indices(show.acts)//items是有序集合属性,items[0]代表第一个元素from Order order where order.items[0].id = 1234//holidays是map集合属性,holidays[national day]是代表其中第一个元素select person from Person person, Calendar calendarwhere calendar.holidays['national day'] = person.birthDay and person.nationality.calendar = calendar//下面同时使用list集合和map集合属性select item from Item item, Order orderwhere order.items[order.deliveredItemIndices[0]] = item and order.id = 11select item from Item item, Order orderwhere order.items[maxindex(order.items)] = item and order.id = 11select item from Item item, Order orderwhere order.items[size(order.items) - 1] = itemselect custfrom Product prod, Store store inner join store.customers custwhere prod.name = 'widget' and store.location.name in ['Melbourne', 'Sydney'] and prod = all elements(cust.currentOrder.lineItems)SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_orderFROM customers cust, stores store, locations loc, store_customers sc, product prodWHERE prod.name = 'widget' AND store.loc_id = loc.id AND loc.name IN ('Melbourne', 'Sydney') AND sc.store_id = store.id AND sc.cust_id = cust.id AND prod.id = ALL( SELECT item.prod_id FROM line_items item, orders o WHERE item.order_id = o.id AND cust.current_order = o.id )7.order by子句from Person as porder by p.name, p.agefrom Person as porder by p.name asc, p.age desc8.group by子句select cat.color, sum(cat.weight), count(cat)from Cat catgroup by cat.color//select后出现的id处出现在group by之后,而name属性则出现在聚集函数中select foo.id, avg(name), max(name)from Foo foo join foo.names namegroup by foo.idselect cat.color, sum(cat.weight), count(cat)from Cat catgroup by cat.colorhaving cat.color in (eg.Color.TABBY, eg.Color.BLACK)select catfrom Cat catjoin cat.kittens kittengroup by cathaving avg(kitten.weight) > 100order by count(kitten) asc, sum(kitten.weight) desc9.子查询from Cat as fatcatwhere fatcat.weight > (select avg(cat.weight) from DomesticCat cat)from Cat as catwhere not (cat.name, cat.color) in ( select cat.name, cat.color from DomesticCat cat)10.fetch关键字from Person as p join p.scoresfrom Document fetch all properties order by namefrom Document doc fetch all properties where lower(doc.name) like '%cat%'11.命名查询<!--定义命名查询--><query name="myNamedQuery"> <!--此处确定命名查询的HQL语句--> from Person as p where p.age > ?</query>调用命名查询的示例代码如下:private void findByNamedQuery() throws Exception ...{ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); System.out.println("执行命名查询"); //调用命名查询 List pl = sess.getNamedQuery("myNamedQuery") //为参数赋值 .setInteger(0, 20) //返回全部结果 .list(); //遍历结果集 for (Integer pit = pl.iterator(); pit.hasNext(); ) ...{ Person p = (Person)pit.next(); System.out.println(p.getName()); } tx.commit(); HibernateUtil.closeSession();}
相关资源:hql语句语法详解hql语句