`
wgj830823
  • 浏览: 49656 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

HQL查询及语法

阅读更多

 

                      HQL查询及语法

HQL:Hibernate Query Language
HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。
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 p

2.select子句
select p.name from Person as p
select p.name.firstName from Person as p
select new list(p.name, p.address) from Person as p
select new ClassTest(p.name, p.address) from Person as p (有前提)
select p.name as personName from Person as p
select new map(p.name as personName) from Person as p (与new map()结合更普遍)

3.聚集函数
avg,count,max,min,sum
select count(*) from Person
select max(p.age) from Person as p
select p.name || "" || p.address from Person as p

4.多态查询
from Person as p
from java.lang.Object o
from Named as n

5.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.mate
select cat, mate
from Cat cat, Cat mate
where cat.mate = mate
from Cat as cat where cat.id = 123
from Cat as cat where cat.mate.id = 69
from Person as person
where person.id.country = 'AU'
     and person.id.medicareNumber = 123456
from Account as account
where account.owner.id.country = 'AU'
     and account.owner.id.medicareNumber = 123456
from Cat cat where cat.class = DomesticCat
from 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 null
from 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 = true
from Cat cat where cat.kittens.size > 0
from Cat cat where size(cat.kittens) > 0
from Calendar cal where maxelement(cal.holidays) > current date
from Order order where maxindex(order.items) > 100
from Order order where minelement(order.items) > 10000
//操作集合元素
select mother from Cat as mother, Cat as kit
where kit in elements(foo.kittens)
//p的name属性等于集合中某个元素的name属性
select p from NameList list, Person p
where 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 calendar
where calendar.holidays['national day'] = person.birthDay
     and person.nationality.calendar = calendar
//下面同时使用list集合和map集合属性
select item from Item item, Order order
where order.items[order.deliveredItemIndices[0]] = item and order.id = 11
select item from Item item, Order order
where order.items[maxindex(order.items)] = item and order.id = 11

select item from Item item, Order order
where order.items[size(order.items) - 1] = item

select cust
from Product prod,
     Store store
     inner join store.customers cust
where 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_order
FROM customers cust,
     stores store,
     locations loc,
     store_customers sc,
     product prod
WHERE 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 p
order by p.name, p.age
from Person as p
order by p.name asc, p.age desc

8.group by子句
select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color
//select后出现的id处出现在group by之后,而name属性则出现在聚集函数中
select foo.id, avg(name), max(name)
from Foo foo join foo.names name
group by foo.id

select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)

select cat
from Cat cat
join cat.kittens kitten
group by cat
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) desc

9.子查询
from Cat as fatcat
where fatcat.weight > (select avg(cat.weight) from DomesticCat cat)

from Cat as cat
where not (cat.name, cat.color) in (
     select cat.name, cat.color from DomesticCat cat
)

10.fetch关键字
from Person as p join p.scores

from Document fetch all properties order by name
from 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语法入门学习

    HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL...

    Hibernate hql查询语法总结

    Hibernate hql查询语法总结 Hibernate hql查询语法总结

    HQL语句的语法

    HQL语句的语法,很基础

    hql查询语言语法

    hql语法,内容详细,教程,it人员的又一使用参考值得你拥有

    HQL语法大全,并带有详细的例子

    HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。HQL查询依赖于Query类,每个Query实例对应一个查询对象,使用HQL查询按 如下步骤进行: (1)获取Hibernate Session对象; (2)编写HQL语句; (3)以HQL...

    HQL 语法总结 实体查询

    HQL 例如对于TUser类 1.实体查询 String hql = " from TUser"; HQL 语法总结

    Spring中常用的hql查询方法

    Spring中常用的hql查询方法_(getHibernateTemplate())

    hql语句语法详解hql语句

    下面介绍HQL语句的语法 1.from子句 2.select子句 3.聚集函数 4.多态查询 5.where子句 6.表达式 7.order by子句 8.group by子句 9.子查询语句 10.fetch关键字 11.命名查询

    Hibernate查询语言(HQL) 语法参考

    HQL中文语法参考, 详细描述hibernate 查询语言的各种语法,是不可多得的HQL中文参考资料!

    Hibernate的HQL查询

    hibernate hql 语法学习的文档

    HQL Eclipse Plugins 配置教程

    不喜欢使用myEclipse的朋友可以尝试下 最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。...工具很好用,可以识别出HQL文的语法正确,并且解析为标准SQL语句。

    J2EE HQL语法大全

    讲解用HQL语法操作数据库的常用方法,帮助你熟练HQL的应用

    超级详细的hql查询语句教程

    超级详细的hql查询语句教程,从浅入深 Hibernate配备了一种非常强大的查询语言,这种...但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。

    强烈建议的HQL语法规则详解

    java开发的都该了解的!!适合于hql的刚刚上手的同志!

    Hive 入门教程-Apache Hive入门介绍与HQL语法解析

    Hive入门经典教程 Apache Hive 淘宝团队验证

    Hibernate HQL查询.docx

    Hibernate 配备了一种非常强大的查询语言,这种语言看上去很像 SQL。但是不要被语法结构上的相似所迷惑,HQL 是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。

    NHibernate查询语言(HQL)文档.

    NHibernate 查询语言(HQL,NHibernate QueryLanguage)是NHibernate 特有的基于面向对象 的SQL 查询语言,它具有继承、多态和关联等特性。实际上是用OOP 中的对象和属性映射 了数据库中的表和列。 例如这一句:...

    HQL查询语言的使用介绍

    HQL是Hibernate Query Language的缩写,语法很想SQL,但是HQL是一种面向对象的查询语言。SQL的操作对象是数据列、表等数据库对象,而HQL操作的是类、实例、属性

    HQL Hibernate查询语言

    Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。

Global site tag (gtag.js) - Google Analytics