OJB查询(一)

原创 2003年09月23日 01:33:00

OJB查询

该文档介绍了不同查询机制的使用。文档中的代码都通过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语句就会报错,所以最好使用和属性名一样。

OJB查询(二)

联接: 在path expressions中(relationship.attribute)声明的联接在criteria中会被OJB自 动处理。Path expressions支持1:1,1:n,m:...
  • Emolasa
  • Emolasa
  • 2003年09月23日 01:33
  • 780

Apache 门户项目组介绍

本文将快速浏览 Apache 门户项目组的所有项目,并着重介绍门户项目组中的核心项目-Jetspeed-2。 0 评论: 廖 健, 首席实施顾问 2006 年 11 月 ...
  • novelly
  • novelly
  • 2014年03月05日 14:56
  • 750

Linux 动态链接库编程入门

Linux 动态链接库编程入门  动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是几个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是L...
  • zkx1982
  • zkx1982
  • 2007年11月06日 18:01
  • 395

OJB(Apache)

......
  • xinlvye
  • xinlvye
  • 2013年10月13日 22:36
  • 395

OJB简介--翻至ojb docs

简介: 对象关系桥(OJB)是一种对象关系映射工具,它能够完成从Java对象到关系数据库的透 明存储。 灵活性: OJB给用户提供了多种存储API,让用户有很多选择: 1. 提供完全的ODMG3.0 ...
  • Emolasa
  • Emolasa
  • 2003年09月23日 01:32
  • 1164

OJB和Hibernate框架的评议一

OJB和Hibernate是我用过两个O/R Mapping框架,附带说一句,我用OJB比Hibernate的时间长多了,因此对Hibernate的了解不深,因此有一些看法可能会有误。 备注: OJB...
  • wl_95421
  • wl_95421
  • 2005年08月30日 14:26
  • 940

OJB的缓存管理

OJB提供缓存接口ObjectCache 在ORM映射中配置如下:   ...   OJB二级缓存 ObjectCacheTwoLeve...
  • xingqinstar
  • xingqinstar
  • 2013年06月09日 21:43
  • 244

mysql查询当前时间,一天内,一周,一个月内的sql语句

select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW...
  • qw463800202
  • qw463800202
  • 2014年11月25日 10:22
  • 3458

sql 查询一年之内的记录

sql 查询一年之内的记录,说一下思路,数据库里面的时间要小于现在的时间,大于1年前现在的时间的。其实就是一个时间段,从去年的今天到今年的今天的这段时间才算是一年之内的。 相关语句: where  C...
  • zhuoyue008
  • zhuoyue008
  • 2017年02月24日 11:54
  • 826

Using Lucene with OJB

November 23, 2004Search is important! All too often search looks like where thing like %that%. Us...
  • zery
  • zery
  • 2005年02月21日 16:16
  • 916
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OJB查询(一)
举报原因:
原因补充:

(最多只允许输入30个字)