EMF查询框架主要由 org.eclipse.emf.query 这个plugin提供,创建并执行一个EMF查询,大概分为如下几步:
 1,创建查询数据源;
 2,构造EObjectCondition查询条件;
 3,使用EMF查询框架提供的SELECT对象和UPDATE对象编写查询和更新语句;
 4,执行语句得到查询或更新结果;
 5,对执行结果进行检测,确保执行过程中没有发生异常。EMF提供了两套Query对象,SELECT和UPDATE,分别用于模型的查询操作和更新操作。
 SELECT对象的类图关系如下:类似SQL语句的from和where从句,SELECT对象的构建需要FROM和WHERE两个对象,分别代表查询范围和查询约束条件(EObjectCondition)。
 除了这两个对象之外,SELECT对象还可能包含下参数信息:
 maximumResultSize:设置查询的最大返回值;
 cancellable:查询是否可撤销,默认值为true;
 progressMonitor:查询监听器。构建EMF SELECT查询代码大致如下:
IQueryResult result = new SELECT(//查询结果封装成IQueryResult对象
        new FROM(searchScope),
        new WHERE(conditions))
    .execute();
//检测执行过程是否出现异常
if (result.getException() != null) {
    log(result.getException());
} else {
    for (Object next : result) {//打印查询结果
        System.out.println("Found " + ((Book) next).getTitle());
    }
}   
其中FROM对象的构造参数可以是单一的EObject对象,也可以是Collection集合,还可能是IEObjectSource对象实例。
 较为复杂的是WHERE对象的构建,或者说是其构造参数EObjectCondition约束条件的构建。EMF查询框架预定义很多查询条件类继承至EObjectCondition,然而熟练的使用这些类并不容易,
 还有一种方法是通过OCL约束表达式构造 BooleanOCLCondition 对象,如果熟练OCL语法,用此种方式相对比较容易。
 但也有不足,就是OCL的解析速度相对较慢。EObjectCondition tolerableRead = new BooleanOCLCondition<EClassifier, EClass, EObject>(
    ocl.getEnvironment(),//ocl根环境
    "self.category <> BookCategory::Mystery implies self.pages < 200",//ocl约束
    EXTLibraryPackage.Literals.BOOK);//约束上下文


构造参数中,还可以不指定约束的上下文(即第3个构造参数为null),这样任何EMF实体如果含有category属性都会在该实体类上执行
 "self.category <> BookCategory::Mystery implies self.pages < 200"约束检测。当查询条件比较多的时候,可以通过EMF的核心查询框架将多个查询条件进行组合:
Resource myResource = ... // get the resource
//条件1,作者的name属性为Bob
Condition cond1 = new BooleanOCLCondition<EClassifier, EClass, EObject>(
    ocl.getEnvironment(),
    "self.name = 'Bob'",
    EXTLibraryPackage.Literals.WRITER);
//条件2,书名为Bob
Condition cond2 = new BooleanOCLCondition<EClassifier, EClass, EObject>(
    ocl.getEnvironment(),
    "self.title = 'Bob'",
    EXTLibraryPackage.Literals.BOOK);

SELECT statement = new SELECT(
    SELECT.UNBOUNDED, false,
    new FROM(myResource.getContents()),
    new WHERE(cond1.OR(cond2)),  // 将两个条件以OR形式组合,满足任一条件皆可。
    new NullProgressMonitor());

// execute the query
IQueryResult results = statement.execute(); 
// do something with the results
selectInEditor(results);
UPDATE对象继承至SELECT对象,除此之外还是用了SET对象进行赋值操作:
构建EMF UPDATE操作代码也与SELECT类似,只是要在构造参数中添加SET对象来为实体赋值:
IQueryResult result = new UPDATE(
        new FROM(searchScope),
        new WHERE(conditions),
        new SET() {//执行赋值操作
            public boolean set(EObject object) {
                ((Book) object).setCategory(BookCategory.MYSTERY_LITERAL);
                return true;
            })
    .execute();
//检测执行过程是否出现异常
if (result.getException() != null) {
    log(result.getException());
} else {
    for (Object next : result) {//打印查询结果
        System.out.println(((Book) next).getTitle() + " is now a mystery");
    }
}