windchill客制化开发常用的SQL语句

241 阅读2分钟

1. XmlObject增删改查

增:

创建查询条件

XmlSearchCriteria<FTReleasefromAppFormBean> criteria = new BaseXmlSearchCriteria<>(FTReleasefromAppFormBean.class);

添加过滤条件

criteria.addFilter(new ColumnFilter(FTReleasefromAppFormBean.PROGRAM_NAME, SearchCondition.EQUAL, programName));

查询

List<XmlObject> search = XWorksHelper.getXmlObjectStoreManager().search(criteria, StoreOptions.LoadOption.ONLY_ROOT);

删:

改:

查:

2.模型对象的增删改查

增:

删:

改:

查:

# Windchill 查询 API 笔记

## 1. QuerySpec

`QuerySpec` 是 PTC 封装的用于查询 Windchill 数据库的 Java 类。它允许你构建数据库查询并且添加查询条件。

### 基本用法:

```java
QuerySpec docQuery = new QuerySpec(WTDocument.class); 
// 等同于 SQL: select * from WTDocument;

添加查询条件:

查询条件通过 SearchCondition 类进行构建,以下是一个简单的例子:

java
SearchCondition condition = new SearchCondition(WTDocument.class, "name", SearchCondition.EQUAL, "测试文档");
// 该条件表示:文档名称为“测试文档”
docQuery.appendWhere(condition, new int[]{0});

获取查询结果:

java
QueryResult queryResult = PersistenceServerHelper.manager.query(docQuery);  // 跳过权限获取结果
// 或者
QueryResult queryResult = PersistenceHelper.manager.find(docQuery);  // 受当前用户权限影响

打印 QuerySpec 对象会显示具体执行的 SQL 语句,可用于调试。

支持的运算符:

  • SearchCondition.EQUAL
  • SearchCondition.LIKE
  • SearchCondition.IS_TRUE
  • SearchCondition.IS_NULL

示例:

通过对象主键构建查询条件:

java
SearchCondition condition = new SearchCondition(WTPart.class, 
    "thePersistInfo.theObjectIdentifier.id", SearchCondition.EQUAL, 1234L);

如果有多个查询条件,使用 appendAnd 拼接:

java
docQuery.appendWhere(condition1, new int[]{0});
docQuery.appendAnd(condition2, new int[]{0});

2. Persistence API

介绍:

PersistenceManagerPersistenceManagerSvr 提供了查询 API,可以用于快速查询关联对象。后者还提供了跨权限的 API。

常用方法:

  • PersistenceHelper.manager.navigate(Persistable p, String association, Class class, boolean flag);
  • PersistenceServerHelper.manager.expand(Persistable p, String association, Class class, boolean flag);

参数说明:

  • Persistable p: 传入的持久化对象,作为查询的起点。
  • String association: 目标对象在关联关系中的角色(Role A 或 Role B)。
  • Class class: 关联关系的 Java 类。
  • boolean flagfalse 表示返回 Link 对象,true 表示返回 Role A 或 Role B 对象。

示例查询:

  1. 通过父件查询子件(返回 WTPartUsageLink 结果集):
java
QueryResult links = PersistenceHelper.server.manager.navigate(parent, 
    WTPartUsageLink.ROLE_BOBJECT_ROLE, WTPartUsageLink.class, false);
  1. 通过父件查询子件(返回子件 WTPartMaster 结果集):
java
QueryResult children = PersistenceHelper.server.manager.navigate(parent, 
    WTPartUsageLink.ROLE_BOBJECT_ROLE, WTPartUsageLink.class, true);
  1. 通过子件查询父件(返回父件 WTPart 结果集):
java
QueryResult parents = PersistenceHelper.server.manager.navigate(child, 
    WTPartUsageLink.ROLE_AOBJECT_ROLE, WTPartUsageLink.class, true);

3. PTC 工具类

PTC 的工具帮助类封装了常用的关联查询。

常用工具类:

  • WTPartHelper.service (WTPartService) – 用于 WTPart 相关的 API。
  • WTDocumentHelper.service (WTDocumentService) – 用于 WTDocument 相关的 API。
  • EPMStructureHelper.service (EPMStructureService) – 用于 EPMDocument 关联查询的 API。
  • MPMProcessPlanHelper.service (MPMProcessPlanService) – 用于 MPMLink 中工艺对象相关 API。

更多工具类和 API 可以参考 Windchill Java Doc 和知识库。

4. Select API

对于复杂的查询,使用封装好的 Select API 进行查询,尤其是当查询条件涉及多个表并且关联复杂时。

示例:

java
public static List<WTPart> queryWTPartByDevicePart(WTPart devicePart, String type) throws WTException {
    Select<?> select = Select.from(WTPart.class, true)  // 0
            .andFrom(WTPartUsageLink.class, false)      // 1
            .andFrom(WTTypeDefinition.class, false)     // 2
            .where(1, QueryConstant.QUERY_LINK_ROLE_A_ID, SearchCondition.EQUAL, 
                    devicePart.getPersistInfo().getObjectIdentifier().getId())
            .where(0, QueryConstant.QUERY_MASTER_REFERENCE_ID, SearchCondition.EQUAL, 
                    1, QueryConstant.QUERY_LINK_ROLE_B_ID)
            .where(2, QueryConstant.QUERY_LOGICAL_ID, SearchCondition.EQUAL, type)
            .where(2, QueryConstant.QUERY_LATEST_ITERATION, SearchCondition.IS_TRUE)
            .where(2, QueryConstant.QUERY_BRANCH_ID, SearchCondition.EQUAL, 
                    0, QueryConstant.QUERY_TYPE_DEFINITION_BRANCH_ID)
            .onlyLatest();

    StatementSpec find = select.toSpec();
    find.setAdvancedQueryEnabled(true);
    QueryResult queryResult = PersistenceHelper.manager.find(find);
    return getResultPartList(queryResult);
}

说明:

  • Select.from(WTPart.class, true) 表示从 WTPart 类开始查询。
  • .andFrom(WTPartUsageLink.class, false) 表示加入 WTPartUsageLink 类,false 表示返回的是 Link 对象。
  • .where(条件) 用于指定查询条件。
  • .onlyLatest() 表示只查询最新的版本。

5. 为两个模型添加关联关系

String psNoStr = "OR:ext.fhec.pid.finaltest.Profession.model.Profession:2637674";

Profession profession = (Profession) PersistenceUtil.getPersistableByReferenceString(psNoStr);

String ftStepCodeStr = "OR:ext.fhec.pid.finaltest.PersonInfo.model.PersonInfo:2635950";

PersonInfo personInfo = (PersonInfo) PersistenceUtil.getPersistableByReferenceString(ftStepCodeStr);

ProfessionToPersonInfoLink professionToPersonInfoLink = ProfessionToPersonInfoLink.newProfessionToPersonInfoLink(profession, personInfo, FtStepCodeConstant.STEP_CODE_ASSOCIATE);
PersistenceHelper.manager.store(professionToPersonInfoLink);