该文档介绍了不同查询机制的使用。文档中的代码都通过Junit测试过。
内容:
1. Query by criteria
2. ODMG Object Query Language(OQL)
3. JDO queries
通过criteria查询:
在本节中,你将学到如何使用criteria进行查询。相应的类放在org.apache.ojb.broker包
中。使用criteria查询既可以得到整个对象(如person),也可以使用report queries得
到一行数据
一个查询主要包含下面两部分:
1. 得到相应类的对象
2. 一系列带有ORDER BY和GROUP
BY的条件列表
OJB提供了一个QueryFactory类来创建一个新的查询。虽然所有的query类的构造方法是公
共的,但是我们还是建议使用QueryFactory来建立一个新的查询:
Query q =
QueryFactory.newQuery(Person.class, crit);
每个条件就代表一个SQL-Where语句。
Criteria crit = new Criteria();
crit.addEqualTo("firstname",
"tom");
crit.addEqualTo("lastname", "hanks");
Query q =
QueryFactory.newQuery(Person.class, crit);
相应的SQL语句如下:
Select
... FROM PERSON Where FIRSTNAME = "tom" AND LASTNAME = "hanks";
查询条件:
OJB提供了所有SQL-comparator的条件选择。在大多数情况下,你不需要自己直接去实现如
EqualToCriteria之类的类。Criteria类提供相应的方法,有如下四种:
1.
通过比较相应字段的值来创建criteria:如addEqualTo(“firstname”,”tom”)
2.
通过比较两个字段来创建criteria:如addEqualToField(“firstname”,”other_fi
eld”)
3. 通过检查是否为空值来创建criteria:如addIsNull(“firstname”)
4. 创建一个模糊的sql
criteria:如addSql(”REVERSE(name) like ‘re%’”)
下面是比较一个字段值的方法:
addEqualTo
addLike
addGreaterOrEqualThan
addGreaterThan
addLike
addBetween ,该方法需要两个参数
addIn , 该方法使用Collection类作为值参数
下面是比较两个字段的方法,都是以…field结尾:
addEqualToField
addGreaterThanField
and of course there
negative forms
in/not in
有些数据库限制了IN语法的参数数目
如有有限制,OJB会把IN语句拆开成几个语句,下面的例子把限制数目设成了3:
Select ... FROM Artikel
A0 Where A0.Kategorie_Nr IN ( ? , ? , ? )
or A0.Kategorie_Nr IN ( ? , ?
) orDER BY 7 DESC
IN的限制能够在OJB.properties中被定义:
...
# The
SqlInLimit entry limits the number of values in IN-sql
# statement, -1
for no limits. This hint is used in Criteria.
SqlInLimit=200
...
and/or
上面得到的查询条件都是“并“的关系,有时候需要获得”与“的关系,如下:
Criteria
crit1 = new Criteria();
crit1.addLike("firstname", "%o%");
crit1.addLike("lastname", "%m%");
Criteria crit2 = new
Criteria();
crit2.addEqualTo("firstname", "hank");
crit1.addOrCriteria(crit2);
Query q =
QueryFactory.newQuery(Person.class, crit1);
Collection results =
broker.getCollectionByQuery(q);
对应的SQL语句如下:
Select ... Where
(FIRSTNAME LIKE "%o%") AND LASTNAME
LIKE "%m%" or FIRSTNAME = "hank"
排序和分组:
下面的方法能够用来排序和分组:
addOrderByAscending(String
anAttributeName);
addOrderByDescending(String anAttributeName);
addGroupBy(String anAttributeName); 该方法用于report queries
你也可以进行多重排序和分组,重复调用addOrderBy就可以:
crit = new Criteria();
crit.addOrderByDescending("id");
crit.addOrderByAscending("lastname");
query = new
QueryByCriteria(Person.class, crit);
broker.getCollectionByQuery(query);
上面的代码将查询所有的Persons,并按id的降序排列,lastname的升序排列。该查询将产
生如下的SQL语句:
Select A0.ID,A0.FIRSTNAME,A0.LASTNAME FROM
PERSON A0 orDER BY 1
DESC, 3
如果你不使用lastname而用LASTNAME,那么新的LASTNAME将会自动被创建:
Select A0.ID,A0.FIRSTNAME,A0.LASTNAME,LASTNAME FROM PERSON A0
orDER BY 1 DESC,
4
如果有多个表都含有LASTNAME,SQL语句就会报错,所以最好使用和属性名一样。
联接:
在path
expressions中(relationship.attribute)声明的联接在criteria中会被OJB自
动处理。Path
expressions支持1:1,1:n,m:n多种关系。
下面的例子查找属于Liquors产品组的所有文章。文章和产品组的关系是在Article类中
的productGroup关系来建立的:
<!-- Definitions for
org.apache.ojb.ojb.broker.Article -->
<class-descriptor
class="org.apache.ojb.broker.Article"
proxy="dynamic"
table="Artikel"
>
...
<reference-descriptor
name="productGroup"
class-ref="org.apache.ojb.broker.ProductGroup"
>
<foreignkey field-ref="productGroupId"/>
</reference-descriptor>
</class-descriptor>
<class-descriptor
class="org.apache.ojb.broker.ProductGroup"
proxy="org.apache.ojb.broker.ProductGroupProxy"
table="Kategorien"
>
...
<field-descriptor
name="groupName"
column="KategorieName"
jdbc-type="VARCHAR"
/>
...
</class-descriptor>
path
expressions包含了productGroup和groupName间1:1的关系
Criteria crit = new
Criteria();
crit.addEqualTo("productGroup.groupName", "Liquors");
Query q = QueryFactory.newQuery(Article.class, crit);
Collection
results = broker.getCollectionByQuery(q);
如果path
expressions指向一个有限制的类,那么查询条件就变成了Ored。下面的例子
查询所有文章名以F开头的ProductGroups。Path
expressions 声明了allArticlesInGr
oup来表示Articles的限制:Books和CDs:
Criteria crit = new Criteria();
crit.addLike("allArticlesInGroup.articleName", "F%");
Query q =
QueryFactory.newQuery(ProductGroup.class, crit, true);
Collection
results = broker.getCollectionByQuery(q);
SQL语句如下:
Select
DISTINCT A0.KategorieName,A0.Kategorie_Nr,A0.Beschreibung
FROM
Kategorien A0
INNER JOIN Artikel A1 ON A0.Kategorie_Nr=A1.Kategorie_Nr
LEFT OUTER JOIN BOOKS A1E0 ON A0.Kategorie_Nr=A1E0.Kategorie_Nr
LEFT OUTER JOIN CDS A1E1 ON A0.Kategorie_Nr=A1E1.Kategorie_Nr
Where A1.Artikelname LIKE 'F%' or
A1E0.Artikelname LIKE
'F%' or
A1E1.Artikelname LIKE 'F%'
Prefetched 关系:
能够使通过关系查询对象的查询次数最小化。在我们的测试中,我们指定ProductGroup
s和Articles有一对多的关系。当查询ProductGroups,通过一个查询获得ProductGroup
s,对于每个ProductGroup我们再通过查询获得它的Articles。
OJB试着通过prefetched关系将属于ProductGroups的所有Ariticles通过一个查询得到。
让我们来看看为什么一个查询基本上不能实现:
Criteria crit = new Criteria();
crit.addLessOrEqualThan("groupId", new Integer(5));
crit.addOrderByDescending("groupId");
crit.addPrefetchedRelationship("allArticlesInGroup");
Query q =
QueryFactory.newQuery(ProductGroup.class, crit);
Collection results =
broker.getCollectionByQuery(q);
第一个查询获得所有匹配的ProductGroups:
Select ... FROM Kategorien A0 Where
A0.Kategorie_Nr <= ?
orDER BY 3 DESC
第二个查询从第一个查询的结构中获得属于ProductGroups的Articles:
Select ... FROM Artikel A0 Where A0.Kategorie_Nr
IN ( ? , ? , ?
, ? , ? ) orDER BY 7 DESC
获得了所有相关的Articles后,该方法还不支持对关系使用Arrays。
查询对象:
OJB查询返回完全的对象,这就意味着所有的实例变量会被赋值,所有的自动获得关系会
被加载。到现在为止,还没有方法能够只获得部分的对象(如仅仅得到personde 的fir
stname和lastname)
Report查询:
Report查询适合获得一行数据,但是不使真正意义上的商业对象。一行数据就是一个对
象数组,通过这些查询你能够定义什么样的对象属性你希望在一行数据中存在。属性名
也可以包括path
expressions如'owner.address.street'。可以使用ReportQuery#setC
olumns(String[]
columns)来定义属性。注意:这里的columns不是数据库中的columns
,column的名字应该和查询中的属性名一样。
下面的ReportQuery总结了每个ProductGroup的库存文章数目和价格:
Criteria crit = new
Criteria();
Collection results = new Vector();
ReportQueryByCriteria q = QueryFactory.newReportQuery(
ProductGroup.class, crit);
//
define the 'columns' of the report
q.setColumns(new String[] {
"groupName",
"sum(allArticlesInGroup.stock)",
"sum(allArticlesInGroup.price)" });
crit.addGroupBy("groupName");
Iterator iter = broker.getReportQueryIteratorByQuery(q);
发表评论
-
数据库常识
2011-07-05 14:56 0delete from aa truncate table ... -
Oracle存储过程实例
2010-01-28 22:47 9234create or replace proc ... -
JDBC事务
2010-01-28 22:28 0作者:Jack Shirazi 开发 ... -
Oracle与SQL Server事务处理的比较
2010-01-28 22:03 1506事务处理是所有大型数 ... -
Sqlldr简介
2009-10-21 14:10 1290罗列了网上常见的三篇Sqlldr的介绍 一:sql lo ... -
Oracle中实现行列转换的方法
2009-07-21 22:31 1250student subject grade -------- ... -
oracle 中日期的加减
2009-07-21 22:00 21535加法 select sysdate,add_mo ... -
Oracle 分页
2009-03-26 17:07 0select * from (select rownum ... -
MYSQL的乱码问题
2009-02-17 12:45 838总结了一下几个处理方法 1:改变数据库的默认编码配置,在MYS ... -
几种开源数据库连接池的使用 --转载
2009-01-17 13:36 1790转载: http://www.blogjava.net/fa ... -
Resin和Tomcat的JNDI数据连接池配置
2009-01-17 13:35 4190先说Resin的JNDI数据池连 ... -
tomcat5.0与tomcat5.5的数据库连接池jndi配置区别
2009-01-17 13:35 1752在tomcat5.5版本以前,可以说jndi配置相对是比较复杂 ... -
tomcat5.0连接池配置成功了,池连,JNDI
2009-01-17 13:34 0http://heisetoufa.iteye.com/blo ... -
java连接oracle数据库的各种方法及java在数据库中的含义
2009-01-17 13:34 1243java与oracle的接口: 在数据库中运行JA ... -
开源数据库连接池proxool
2009-01-17 13:32 1740关键词:proxool 连接池 开源 可以根据自己的实际情况, ... -
java实现 excel 中数据导入 oracle
2009-01-17 13:31 2952ORACLE是有一个叫ADI的解决方案 所需的额外包:comm ... -
registerOutParameter Method (SQLServerCallableStat
2009-01-17 13:31 1097registerOutParameter Method (SQ ... -
JDBCTM 指南CallableStatement
2009-01-17 13:31 10817 - CallableStatement 本概述 ... -
OJB MySQL 配置
2009-01-17 13:26 11281. repository-database.xml < ... -
深入解析什么是存储过程
2009-01-17 13:26 2247深入解析什么是存储过 ...
相关推荐
4. **Query API**: OJB提供了强大的查询API,允许开发者用面向对象的方式编写查询,甚至支持复杂的关联查询和分页查询。 5. **事务管理**: OJB集成了JTA(Java Transaction API),可以处理分布式事务,确保数据的...
在实际开发中,db-ojb作为ORM解决方案,它提供了一种方式来映射Java对象到数据库表,使得开发人员可以使用面向对象的方式来操作数据库,而不是传统的SQL查询。Struts则负责应用程序的架构,通过分离业务逻辑、表示层...
标题:"ojb-study" 描述:"学习、介绍ojb的小资料" ### OJB:对象/关系映射的杰出代表 OJB(Object-JDBC Bridge)是一款强大的对象/关系映射(Object-Relational Mapping,简称ORM)工具,旨在简化Java应用程序与...
ibatis是一种轻量级的ORM框架,相较于Hibernate和Apache OJB等更为全面的ORM解决方案,它提供了一种“半自动化”的对象关系映射(ORM)实现。所谓的“半自动化”,指的是在使用ibatis时,开发者需要手动编写SQL语句...
### ObJectRelationalBridge (OJB) 英文手册知识点概述 #### 一、OJB简介 **ObJectRelationalBridge (OJB)** 是一个面向对象与关系型数据库映射工具,它允许Java对象对关系型数据库进行透明持久化处理。这意味着...
相较于 Hibernate 和 Apache OJB 这些“一站式”ORM解决方案,iBatis 提供了一种“半自动化”的ORM实现方式。这意味着它在一定程度上依赖于手动编写 SQL 语句,并将其与 Java 对象映射起来,从而在灵活性和性能方面...
1. **复杂查询**:当应用程序需要执行复杂的SQL查询时,ibatis提供了一个很好的解决方案。由于可以直接编写SQL语句,因此可以更精确地控制查询逻辑,从而提高查询效率。 2. **性能敏感的应用**:对于那些对性能有...
与Hibernate和Apache OJB等一站式ORM解决方案不同,iBATIS允许开发者更自由地控制SQL查询,提供了更高的灵活性。这个框架由SQL Maps和Data Access Objects (DAOs)两个主要组件构成,还有一些辅助工具。 **SQL Maps*...
2.5 数据查询语言(DQL) 2.6 数据控制语言(DCL) 2.7 数据库中的对话、事务和锁定 2.8 创建和使用函数 2.9 创建和使用存储过程 2.10 常用函数 2.11小结 第2部分 软件开发基础 第3章 开发环境的构建 3.1 JDK的安装 ...
这个课题是iOS开发中的关键部分,特别是对于那些需要提供基于位置服务的应用,如导航、生活服务查询或是社交应用等。 首先,我们要了解的是Apple提供的核心框架——Core Location。该框架负责处理与设备位置相关的...
在Java中,ORM框架如Hibernate、Apache OJB、iBatis等,提供了比直接使用JDBC更高级别的抽象,减少了大量重复的SQL编写工作,使得数据库访问更加面向对象,更易于理解和维护。ORM框架还通过缓存策略和查询优化,提升...
与其他“一站式”ORM解决方案(如Hibernate和Apache OJB)相比,ibatis更侧重于SQL查询语句的编写,而不仅仅局限于对象和数据库表之间的简单映射。这意味着开发者需要自己编写SQL语句,并手动处理结果集,从而获得更...
- ORM(对象关系映射)框架的出现,如Hibernate、TopLink和OJB,解决了模型间的转换问题,提供了面向对象的方式来操作数据库。 2. **安装配置Hibernate**: - 下载Hibernate最新或特定版本(如3.2.5)。 - 添加...
- **iBATIS** 是一种“半自动化”的对象关系映射(ORM)框架,它不同于完全自动化的 ORM 框架(如 Hibernate 和 Apache OJB),而是提供了一种更加灵活的方式来处理数据库操作。 #### 二、iBATIS 的特点 - **“半...
MyBatis 提供了半自动的 ORM 实现,相比于 Hibernate 和 Apache OJB 这类“一站式”ORM 解决方案,MyBatis 更加灵活。 【MyBatis的运行环境】 MyBatis 的运行环境需要包含两个主要的 jar 包:mybatis-3.x.x.jar...
与其他ORM框架如Apache OJB、iBatis相比,Hibernate具有以下优势: - 功能强大且成熟,已成为Java ORM的事实标准。 - 提供良好的性能,支持二级缓存和查询优化。 - 提高开发效率,降低维护成本,通过对象操作即可...
ibatis是一种“半自动化”的对象关系映射(ORM)框架,与“一站式”ORM解决方案如Hibernate和Apache OJB相比,ibatis提供了更为灵活的方式来处理数据库交互。ibatis允许开发者手动编写SQL语句,并通过配置文件将Java...
此外,还讨论了SQL/JDBC、Entity Bean CMP、JDO、Apache OJB和iBATIS等不同持久化方案的优缺点,其中Hibernate因其成熟、流行和强大的功能而被广泛采用。 **二、Hibernate入门** Hibernate是一个优秀的开源ORM框架...