`

又一种hibernate 的高级查询的用法(备忘)

阅读更多
复合查询:
            复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如User实体对象与Addres实体对象具有一对多的关联关系,我们可以如下构造符合查询:
            Criteria criteria=session.createCriteria(User.class);
               Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
               addcriteria.add(Express.like(“address”,”%tianjin%”));
              List list=criteria.list();
               for(int i=0;i
                 User user=(User)list.get(i);
                 System.out.println(user.getName()+”\n”);
                 Set addresses=user.getAddresses();
                 Iterator it=addresses.iterator();
                 while(it.hasNext(){
                  Address address=(Address)it.next();
                  System.out.println(address.getAddress()+”\n”);
                 }
               }
            当执行到了(1)处时,表明要针对User对象的addresses属性添加新的查询条件,因此当执行criteria.list()时,Hibernate会生成类似如下的SQL语句:
            Select * from user inner join address on user.id=address.id where
            address.address like ‘%shanghai%’;
            正如我们所见,我们可以通过向Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象),来构造复合查询,在数据库一端是通过内连接查询来实现。

分享到:
评论
1 楼 hackpro 2010-10-20  
DetachedCriteria:
            在Hibernate2中,Criteria实例是与创建它的Session实例具有相同的生命周期的,也就是说,Session实例是它所创建的Criteria实例的宿主,当Session关闭时,寄生于Session实例的Criteria都将失效。这就对Criteria的重用造成了困难,为了实现Criteria实例的重用,在Hibernate3中提供了一个DetachedCriteria类,DetachedCriteria实例的生命周期与Session实例的生命周期无关,我们可以利用DetachedCriteria对一些常用的Criteria查询条件进行抽离,当需要进行检索时再与Session实例关联,从而获得运行期的Criteria实例。如下面的代码所示:
               DetachedCriteria dc= DetachedCriteria.forClass(User.class);
               dc.add(Expression.eq(“name”,”zhaoxin”));
               dc.add(Expression.eq(“sex”,”1”));
               Criteria criteria=dc.getExecutableCriteria(session);
               Iterator it=criteria.list().iterator();
               while(it.hasNext()){
                 User user=(User)it.next();
                 System.out.println(user.getName());
               }
            
            正如我们所见,DetachedCriteria的生存周期与session实例无关,当需要进行检索时,通过getExecutableCriteria(session)方法,与当前的Session实例关联并获得运行期的Criteria实例,完成检索。
            DetachedCriteria也可以用于完成子查询功能,如下代码所示:
            DetachedCriteria dc= DetachedCriteria.forClass(User.class);
            dc.setProjection(Projections.avg(“age”));
            Criteria criteria=session.createCriteria(User.class);
            criteria.add(Subqueries.propertyGt(“age”,dc));
            List list=criteria.list();   // .list();无缓存
            通过Subqueries类,实现了添加子查询的功能,我们将DetachedCriteria所设定的查询条件,当作子查询添加到了运行时Criteria实例的查询条件中,当执行检索时Hibernate会生成类似如下的SQL语句:
            Select * from user where age>(select avg(age) from user group by
            age);

相关推荐

    Hibernate 备忘

    Criteria API 是另一种进行动态查询的方式,比 HQL 更为灵活,允许在运行时构建查询。它通过构建 Criteria 对象并添加限制条件来生成查询。 7. **事务管理** Hibernate 支持 JTA(Java Transaction API)和 JDBC ...

    基于Struts和Hibernate的医院药品管理系统毕业设计论文.docx

    5. JAVA语言的应用:JAVA语言是一种基于面向对象的编程语言,它能够实现面向对象的编程。我们使用JAVA语言来实现系统的业务逻辑,并使用其它技术来实现系统的其它功能。 6. 数据库设计:数据库设计是指对数据库的...

    Spring 备忘 (一)

    这个备忘系列将探讨 Spring 的主要组成部分和使用方法。 **IoC 容器** IoC 是 Spring 的核心概念,它通过反转对象创建和管理的控制权,使得开发者不再手动实例化对象,而是由框架负责对象的生命周期。Spring 提供...

    Java23种设计模式

    工厂方法模式是一种创建型模式,提供了一种创建对象的方法,可以根据需要创建不同的对象。工厂方法模式的优点是可以根据需要创建不同的对象,而不需要关心对象的创建细节。 1.1.2 抽象工厂 抽象工厂模式是一种创建...

    高级java工程师面试考纲,java高级工程师进阶知识地图

    - **MVC框架**:至少熟练掌握一种MVC框架(如SpringMVC、Struts)的工作原理和使用方法。 - **ORM框架**:至少精通一个ORM框架(如Hibernate、MyBatis),理解对象关系映射的概念及其在项目中的应用。 #### 数据...

    STRUTS备忘录、

    它提供了一种组织应用程序的方式,使得开发者能够更高效地构建可维护、结构清晰的Web应用。本备忘录将深入探讨Struts的核心概念、架构以及如何在实际项目中使用它。 **1. MVC模式** Struts是基于Model-View-...

    java版本控制(数据库版本控制)

    Java作为一种广泛应用的编程语言,提供了多种实现数据库版本控制的方法。本篇文章将深入探讨“java版本控制(数据库版本控制)”,并结合备忘录设计模式来阐述其原理和实践。 首先,我们来理解什么是备忘录设计模式...

    oracle存储过程学习经典入门

    Oracle 存储过程是 Oracle 数据库中的一种程序单元,能够完成复杂的业务逻辑和数据操作。Oracle 存储过程的基础知识包括了解 Oracle 存储过程的基本语法、数据类型、变量声明、控制语句、循环语句、异常处理等方面的...

    23种JAVA设计模式

    4. **迭代器模式**:提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 5. **中介者模式**:定义一个中介对象来简化原本复杂的对象间交互。 6. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的...

    Java开发中的23种设计模式

    8. **迭代子模式**(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 9. **模板方法模式**(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中,...

    Java项目开发平台开发规范方案.docx

    Hibernate支持CRUD(创建、读取、更新和删除)操作,并提供了一种称为HQL(Hibernate查询语言)的SQL方言,用于执行复杂的数据库查询。 3. **动态bean技术**: 动态bean允许在运行时动态创建和修改对象的属性,...

    Oracle PlSql 存储过程

    Oracle PlSql 存储过程是 Oracle 数据库中的一种编程语言,用于实现复杂的业务逻辑和数据处理。下面是对 Oracle PlSql 存储过程的详细介绍: 一、 Oracle 存储过程目录 Oracle 存储过程目录是指 Oracle 数据库中...

    java设计模式的分析及其应用

    - 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 - 中介者模式(Mediator):定义一个中介对象协调多个对象之间的交互。 - 备忘录模式(Memento):在不破坏封装的前提下...

    本科毕业设计--基于javaee的个人数字图书馆的设计与实现.doc

    Java EE 是一种流行的企业级应用平台,广泛应用于企业级应用开发中。个人数字图书馆是指个人管理和组织数字资源的系统,旨在帮助个人更好地管理自己的知识和信息资源。基于 Java EE 的个人数字图书馆的设计与实现是...

    Oracle+PlSql存储过程

    Oracle PL/SQL存储过程是Oracle数据库中的一种重要编程机制,用于封装复杂的数据库操作逻辑,提高数据库性能,并且便于代码管理和重用。以下是对Oracle存储过程的详细解释。 **Oracle存储过程基础知识** Oracle存储...

    oracle 存储过程学习经典

    - **使用Hibernate调用存储过程**: Hibernate提供了一种便捷的方式来调用存储过程,并处理结果集。 #### 九、在存储过程中做简单动态查询 - **本地动态SQL**: 直接在存储过程中构建动态SQL语句。 - **使用DBMS_SQL...

    JAVA与模式读书笔记。

    例如,单例模式确保一个类只有一个实例,而工厂方法模式则提供了一种创建对象而不暴露其创建过程的方式。 3. **结构型模式** 结构型模式关注如何将类或对象组合成更大的结构,比如适配器(Adapter)、桥接(Bridge...

    oracle存储过程学习经典

    PACKAGE集合了多个存储过程、函数、变量和SQL语句,允许共享变量和游标,提供了一种模块化的方式来组织和管理复杂的数据库逻辑。 综上所述,Oracle存储过程的学习不仅涉及基础语法和结构的理解,还需要掌握其高级...

    设计模式相关资料

    设计模式是软件工程中的一种重要概念,它是在特定情境下为了解决常见问题而形成的一套最佳实践。这些模式经过时间的验证,被广泛应用于各种编程语言中,以提高代码的可读性、可维护性和复用性。设计模式不仅体现了...

    java面试题大全

    Java是一种广泛使用的面向对象的编程语言,以其平台独立性、高效性和丰富的类库而闻名。在Java面试中,面试官通常会考察候选人的基础知识、编程能力、问题解决技巧以及对框架和并发的理解。本资源“java面试题大全”...

Global site tag (gtag.js) - Google Analytics