`
taimukang
  • 浏览: 183930 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate的查询方式

    博客分类:
  • J2EE
阅读更多

Hibernate的查询方式有:

 

1.使用主键id加载对象(load(),get());

2.通过对象导航,比如通过stu.getTeam()得到team的实例;

3.使用hql;

4.使用qbc(query by criteria)

5.直接使用sql语句取得记录集;

一般都使用后面三种方式.

注意.hql是面向对象的查询.语法和sql是基本一样的.不区分大小写的,但是注意的是对与对象.必须遵循对象的大小写.因为hql是对像查询..同时我们必须清楚.hql只能取得对象,而不支持uid(update,insert.delete)

 

 

HQL功能最强大,适合各种情况,但是动态条件查询构造起来很不方便
Criteria最适合动态条件查询,不太适合统计查询,QBE还不够强大,只适合相当简单的查询
NativeSQL可以实现特定数据库的SQL,但是可移植性就牺牲了

Hibernate2的Criteria功能不够完善,所以Hibernate2上面可用的只有HQL和NativeSQL,Hibernate3的Criteria已经非常强大了。

针对web应用来说,大部分常规查询都是动态条件查询,所以首选使用Criteria,并且Hibernate3提供了DetachedCriteria,可以在web层构造好DetachedCriteria再进入session执行查询,非常方便实用的特性。

但是涉及到统计查询和非常复杂的关联查询,Criteria就无能为力了,这种情况下我选择使用HQL。

 

 

 

以下是HQL/QBC/Native SQL三种查询策略
HQL策略:

Java代码
session.createQuery("FROM Category c where c.name like 'Laptop%'"); 

session.createQuery("FROM Category c where c.name like 'Laptop%'"); 

QBC策略:

Java代码
session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%")); 

session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%")); 

Native SQL策略

Java代码
session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").  
addEntity("c",Category.class); 

session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").
addEntity("c",Category.class); 

节 8.02    分页查询

Java代码
Criteria criteria = session.createCriteria(Category.class)  
.add(Restrictions.like("name", "Laptop%"));  
criteria.addOrder(Order.asc("name"));  
criteria.setFirstResult(0);//初始行数  
criteria.setMaxResults(20);//每页显示行数 

Criteria criteria = session.createCriteria(Category.class)
.add(Restrictions.like("name", "Laptop%"));
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);//初始行数
criteria.setMaxResults(20);//每页显示行数 

节 8.03    数据过滤
方法                      说明   
Restrictions.eq         =  
Restrictions.allEq      利用Map来进行多个等于的限制   
Restrictions.gt         >   
Restrictions.ge         >=   
Restrictions.lt         < 
Restrictions.le         <=   
Restrictions.between    BETWEEN  
Restrictions.like       LIKE  
Restrictions.in         in  
Restrictions.and        and  
Restrictions.or         or  
Restrictions.sqlRestriction     用SQL限定查询
(a)    应用限制

Java代码
Criterion emailEq = Restrictions.eq("email", "w@163.com");  
Criteria criteria = session.createCriteria(User.class);  
criteria.add(emailEq);  
User user = (User)criteria.uniqueResult(); 

Criterion emailEq = Restrictions.eq("email", "w@163.com");
Criteria criteria = session.createCriteria(User.class);
criteria.add(emailEq);
User user = (User)criteria.uniqueResult(); 

(b)    比较表达式

Java代码
Restrictions.between("amount", new BigDecimal(100), new BigDecimal(200));  
Restrictions.gt("amount", new BigDecimal(100));  
Restrictions.in("email", emails);//注:emails为集合  
Restrictions.isNull("email");  
Restrictions.isNotNull("email");  
Restrictions.isEmpty("bids");  
Restrictions.sizeGe("bids", 3);//bids属性大小 

Restrictions.between("amount", new BigDecimal(100), new BigDecimal(200));
Restrictions.gt("amount", new BigDecimal(100));
Restrictions.in("email", emails);//注:emails为集合
Restrictions.isNull("email");
Restrictions.isNotNull("email");
Restrictions.isEmpty("bids");
Restrictions.sizeGe("bids", 3);//bids属性大小 

(c)    字符串匹配

Java代码
Restrictions.like("email", "G%");  
Restrictions.like("email", "G%",MatchMode.START);  
注:MatchMode分为START,END,ANYWHERE,EXACT四种模式  
Restrictions.like("email", "G%").ignoreCase(); 

Restrictions.like("email", "G%");
Restrictions.like("email", "G%",MatchMode.START);
注:MatchMode分为START,END,ANYWHERE,EXACT四种模式
Restrictions.like("email", "G%").ignoreCase(); 

(d)    组合表达式和逻辑操作符

Java代码
Restrictions.or(  
                Restrictions.and(  
                        Restrictions.like("firstname", "G%"),  
                        Restrictions.like("lastname", "K%")),  
                        Restrictions.in("email",emails)); 

Restrictions.or(
                Restrictions.and(
                        Restrictions.like("firstname", "G%"),
                        Restrictions.like("lastname", "K%")),
                        Restrictions.in("email",emails)); 

(e)    SQL表达式

Java代码
Restrictions.sqlRestriction("{alias}.name='tie' and {alias}.addr='dalian'");  
Restrictions.sqlRestriction("{alias}.name=?",  "tie", Hibernate.STRING);//姓名为tie的对象  
Restrictions.sqlRestriction("length({alias}.PASSWORD) < ?",5,Hibernate.INTEGER);  
//密码小于5个字符对象  
Restrictions.sqlRestriction("'100' >all( select b.AMOUNT FROM BID b " +  
                " WHERE b.ITEM_ID = {alias}.ITEM_ID)");//返回出价不大于100 

Restrictions.sqlRestriction("{alias}.name='tie' and {alias}.addr='dalian'");
Restrictions.sqlRestriction("{alias}.name=?",  "tie", Hibernate.STRING);//姓名为tie的对象
Restrictions.sqlRestriction("length({alias}.PASSWORD) < ?",5,Hibernate.INTEGER);
//密码小于5个字符对象
Restrictions.sqlRestriction("'100' >all( select b.AMOUNT FROM BID b " +
                " WHERE b.ITEM_ID = {alias}.ITEM_ID)");//返回出价不大于100 


(f)    子查询

节 8.04    表关联
(a)    隐式关联
隐式关联有两种方法:
1、    Criteria接口的createCriteria()方法:

Java代码
session.createCriteria(Item.class)  
.add(Restrictions.like("description", "Foo",MatchMode.ANYWHERE))  
.createCriteria("bids")  
.add(Restrictions.gt("amount",new BigDecimal(100)));  
 
session.createCriteria(Item.class)  
            .createCriteria("seller")  
            .add(Restrictions.like("email", "%@")); 

session.createCriteria(Item.class)
.add(Restrictions.like("description", "Foo",MatchMode.ANYWHERE))
.createCriteria("bids")
.add(Restrictions.gt("amount",new BigDecimal(100)));

session.createCriteria(Item.class)
            .createCriteria("seller")
            .add(Restrictions.like("email", "%@")); 

2、    分配别名:

Java代码
session.createCriteria(Item.class)  
            .createAlias("bids","b")  
            .add(Restrictions.like("description", "%Foo%"))  
            .add(Restrictions.gt("b.amount", new BigDecimal(100)));  
 
session.createCriteria(Item.class)  
            .createAlias("seller", "s")  
            .add(Restrictions.like("s.email","%@")); 

session.createCriteria(Item.class)
            .createAlias("bids","b")
            .add(Restrictions.like("description", "%Foo%"))
            .add(Restrictions.gt("b.amount", new BigDecimal(100)));

session.createCriteria(Item.class)
            .createAlias("seller", "s")
            .add(Restrictions.like("s.email","%@")); 

(b)    抓取关联

Java代码
session.createCriteria(Item.class)  
            .setFetchMode("bids",FetchMode.JOIN)  
            .add(Restrictions.like("description", "%Foo%")) 

session.createCriteria(Item.class)
            .setFetchMode("bids",FetchMode.JOIN)
            .add(Restrictions.like("description", "%Foo%")) 



节 8.05    投影/报表查询
(a)    简单投影

Java代码
session.createCriteria(Item.class)  
        .add(Restrictions.gt("endDate", new Date()))  
        .setProjection(Projections.id());//返回单一属性  
 
session.createCriteria(Item.class).setProjection(  
Projections.projectionList().add(Projections.id()).  
add(Projections.property("description")));//返回一个Object[] 

session.createCriteria(Item.class)
        .add(Restrictions.gt("endDate", new Date()))
        .setProjection(Projections.id());//返回单一属性

session.createCriteria(Item.class).setProjection(
Projections.projectionList().add(Projections.id()).
add(Projections.property("description")));//返回一个Object[] 


(b)    统计分组

Java代码
session.createCriteria(Item.class)  
.setProjection(Projections.rowCount());  
 
session.createCriteria(Item.class)  
            .setProjection(Projections.projectionList()  
            .add(Projections.rowCount())  
            .add(Projections.sum("sales"))  
            .add(Projections.avg("score"))  
            );  
 
    session.createCriteria(Bid.class)  
        .createAlias("bidder", "u")  
        .setProjection(Projections.projectionList()  
                .add(Property.forName("u.id").group())  
                .add(Property.forName("u.username").group())  
                .add(Property.forName("id").count())  
                .add(Property.forName("amount").avg())  
            ); 

session.createCriteria(Item.class)
.setProjection(Projections.rowCount());

session.createCriteria(Item.class)
            .setProjection(Projections.projectionList()
            .add(Projections.rowCount())
            .add(Projections.sum("sales"))
            .add(Projections.avg("score"))
            );

    session.createCriteria(Bid.class)
        .createAlias("bidder", "u")
        .setProjection(Projections.projectionList()
                .add(Property.forName("u.id").group())
                .add(Property.forName("u.username").group())
                .add(Property.forName("id").count())
                .add(Property.forName("amount").avg())
            ); 



(c)    SQL投影

Java代码
String sqlFragment = "(select count(*) from Item i where i.item_id = item_id) " 
                + " as numofitems";  
        session.createCriteria(Bid.class).createAlias("bidder", "u")  
                .setProjection(  
                        Projections.projectionList().add(  
                                Projections.groupProperty("u.id")).add(  
                                Projections.groupProperty("u.username")).add(  
                                Projections.count("id")).add(  
                                Projections.avg("amount")).add(  
                                Projections.sqlProjection(sqlFragment,  
                                        new String[] { "numofitems" },  
                                        new Type[] { Hibernate.LONG }))  
 
                ); 

分享到:
评论
2 楼 Leisurez 2014-02-10  
[i][u]
引用
[list]
[*]
[/list]
[/u][/i]
1 楼 Leisurez 2014-02-10  
[flash=200,200][/flash]

相关推荐

    Hibernate查询方式代码示例

    **Hibernate查询方式详解** 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本教程将深入探讨Hibernate 3.x版本中的查询方式,包括基本查询、HQL(Hibernate Query ...

    hibernate查询方法

    **Hibernate查询方法大全** Hibernate,作为Java领域中最流行的持久化框架之一,提供了多种查询数据的方法。这些方法使得开发者能够高效地从数据库中检索、更新和删除数据,无需编写大量SQL语句。本篇文章将深入...

    hibernate的查询方式介绍和hibernate的批处理和连接池配置hibernate

    ### Hibernate 查询方式与批处理及连接池配置详解 #### 一、Hibernate 查询方式介绍 Hibernate 是一款优秀的 ORM(对象关系映射)框架,它能够极大地简化数据库操作,并提供多种查询方式来满足不同的业务需求。 #...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置...hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式

    通用的hibernate查询

    【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的...理解并熟练掌握这些查询方式,将有助于我们在Java开发中更好地运用Hibernate。

    hibernate中的查询方式

    ### Hibernate中的查询方式详解 #### 一、HQL查询(Hibernate Query Language) HQL是Hibernate提供的面向对象的查询语言,其语法与SQL相似但并非完全相同。HQL的一个显著优势在于它具有很好的跨数据库能力,这...

    hibernate面试题2

    9. **Hibernate查询方式**: - **SQL**:直接执行SQL查询。 - **Criteria API**:面向对象的查询方式。 - **HQL(Hibernate Query Language)**:面向对象的查询语言,支持属性、参数、关联、分页和统计函数查询...

    Hibernate连表查询 Hibernate连表查询

    根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)...

    Hibernate_query查询数据表中的一个字段.

    无论哪种查询方式,最后都会返回一个结果列表,你可以遍历这个列表来获取并处理查询到的`username`字段的值。 总结,Hibernate提供多种方式查询数据表中的字段,包括HQL、Criteria API和DetachedCriteria,选择合适...

    三种查询方式跟踪Hibernate源码

    本文将详细阐述通过三种查询方式跟踪Hibernate源码的方法,帮助开发者更好地掌握其工作原理。 首先,我们来看第一种查询方式:HQL(Hibernate Query Language)查询。HQL是Hibernate专有的SQL方言,允许开发者以...

    struts+hibernate查询所有记录

    ### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...

    hibernate多表联合查询

    在Hibernate中,可以使用以下几种方式来实现多表联合查询: - **HQL (Hibernate Query Language)** - **Criteria API** - **Native SQL** 本文将重点介绍如何使用HQL和Native SQL来实现多表联合查询。 #### 三、...

    Hibernate查询练习小例子

    利用MYSQL数据库提供的样例数据库world建立的查询小例子。已经建立好了数据库对应的...本项目主要是为了练习使用Hibernate查询数据库。如果有什么问题可以发站内信或者邮件asddf14@hotmail.com。我会尽量解答一下~~~

    hibernate查询详解

    hibernate查询详解 在Java开发中,Hibernate作为一款强大的ORM(Object-Relational Mapping)框架,极大地简化了数据库操作。本文将详细介绍Hibernate的五种查询方式,包括HQL查询、Criteria方法、动态查询...

    Hibernate查询语言HQL.PPT

    4. 使用 Hibernate 条件 API:提供了类型安全的面向对象的方式执行查询。 5. 使用本地 SQL 查询:Hibernate 只关心把 JDBC 结果集映射到持久对象图。 使用 HQL 的优点: * HQL 是一种面向对象的查询语言,易于学习...

    hibernate

    **六、Hibernate 查询方式** 1. **HQL**: Hibernate 专有的查询语言,类似SQL,但操作的是对象。 2. **Criteria API**: 动态构建查询条件,更加面向对象的查询方式。 3. **Native SQL**: 直接使用原生SQL进行查询,...

    六种方式实现hibernate查询

    六种方式实现Hibernate查询 Hibernate是一个功能强大的持久层框架,它提供了多种方式来查询数据库。下面我们将详细介绍六种方式实现Hibernate查询。 HQL查询 HQL(Hibernate Query Language)是Hibernate自己的...

    hibernate里面的 两种查询

    Hibernate提供了两种主要的查询方式:离线查询(Criteria API)和HQL(Hibernate Query Language)语句查询。这两种查询方法各有特点,适用于不同的场景,使得开发者可以根据实际需求灵活选择。 1. Hibernate ...

    hibernate实现动态SQL查询

    在Hibernate中,我们通常使用HQL(Hibernate Query Language)或Criteria API进行查询,但这些方式并不支持复杂的动态查询。为了实现动态SQL,我们可以借助于Hibernate的QBC(Query By Criteria)和Criteria API,...

Global site tag (gtag.js) - Google Analytics