【Windchill高级查询感悟笔记】

2024-06-16 09:04

本文主要是介绍【Windchill高级查询感悟笔记】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先从这个例子来开始我们的高级查询之旅

{QuerySpec queryspec = new QuerySpec();queryspec.appendClassList(WTPart.class, true);queryspec.appendClassList(WTDocument.class, true);PersistenceManagerSvr pms = (PersistenceManagerSvr) InvocationHandlerFwd.getInterfaceObject(PersistenceManagerSvr.class);QueryResult qr = pms.query(queryspec);
}

QuerySpec对象是用来指定查询表达式的,

    queryspec.appendClassList()是用来指定From子句的,如果有多个这样的表达式而没有其他条件,那么就是对相应的被查询对象“求笛卡儿积”;

  例如上面的例子就会形成下面的Form子句:

From WTPART,WTDOCUMENT

指定From子句有两种方式

queryspec.appendClassList(WTPart.class, false);			//指定具体的对象qs.appendFrom(new ExternalTableExpression("GZMTRECR"));	//指定具体的表

在appendClassList()中有两个参数,第一个参数是用来指定被查询对象,第二个参数用来指定查询的返回形式:true以对象的形式返回,false以属性的方式返回;

    如果是用appendClassList()来指定查询对象,那么查询结果QueryResult qr对象qr.nextElement()得到的是Object数组,具体的结果保存在这个数组中;

Select子句中指定返回字段

    不管queryspec.appendClassList()方法的第二个参数是true还是false,结果都会返回整个对象或者所有的字段;

    要想过滤返回的字段,需要增加下面的代码

{QuerySpec queryspec = new QuerySpec();int a = queryspec.appendClassList(WTPart.class, false);//返回属性int b = queryspec.appendClassList(WTDocument.class, true);//返回对象//--------------------------------------------------------------------ClassAttribute ca = new ClassAttribute(WTPart.class, "master>number"); //µÚ¶þ¸ö²ÎÊý±ØÐëʱÏàÓ¦ÒµÎñ¶ÔÏóµÄÊôÐÔqueryspec.appendSelect(ca, false); //--------------------------------------------------------------------CompositeWhereExpression andExpression = new CompositeWhereExpression(LogicalOperator.AND);andExpression.append(new SearchCondition(ca, "=", new ConstantExpression("TEST_PRODUCT_ONE")), null);queryspec.appendWhere(andExpression);//--------------------------------------------------------------------}	SELECT A1.NUMBER FROM WTPART A0, WTPARTMASTER A1 WHERE A0.IDA3MASTERREFERENCE = A1.IDA2A2;

通过TableColumn指定查询条件

 {QuerySpec queryspec = new QuerySpec();int classIndex = queryspec.appendClassList(WTPart.class, false);ClassAttribute classAttr = new ClassAttribute(WTPart.class, "partType");queryspec.appendSelect(classAttr, new int[] { classIndex }, false);TableColumn tc = new TableColumn(null, "IDA2A2");queryspec.appendWhere(new SearchCondition(tc, "=", new ConstantExpression(new Long(4638))), new int[] { classIndex });PersistenceManagerSvr pms = (PersistenceManagerSvr) InvocationHandlerFwd.getInterfaceObject(PersistenceManagerSvr.class);QueryResult qr = pms.query(queryspec);}    SELECT PARTTYPE FROM WTPART WHERE IDA2A2 = 4638;
========================================================================================================================================
Column Expression	ClassAttribute           SQLFunction           ConstantExpression         KeywordExpression        TableColumn
Table Expression	ClassTableExpression     ClassViewExpression   SubSelectExpression        ExternalTableExpression
WHERE Clause		SearchCondition          ExistsExpression      CompositeWhereExpression   NegatedExpression
========================================================================================================================================

多对象多条件查询

{QuerySpec queryspec = new QuerySpec();int a = queryspec.appendClassList(WTPart.class, true);int b = queryspec.appendClassList(WTPartMaster.class, true);//TableExpression[] tables = new TableExpression[2];//tables[0] = queryspec.getFromClause().getTableExpressionAt(a);//tables[1] = queryspec.getFromClause().getTableExpressionAt(b);String[] aliases = new String[2];aliases[0] = queryspec.getFromClause().getAliasAt(a);aliases[1] = queryspec.getFromClause().getAliasAt(b);TableColumn tc1 = new TableColumn(aliases[0],"IDA2A2");TableColumn tc2 = new TableColumn(aliases[0],"IDA3MASTERREFERENCE");TableColumn tc3 = new TableColumn(aliases[1],"IDA2A2");CompositeWhereExpression andExpression = new CompositeWhereExpression(LogicalOperator.AND);andExpression.append(new SearchCondition(tc1, "=", new ConstantExpression(new Long(4638))));andExpression.append(new SearchCondition(tc2, "=", tc3));queryspec.appendWhere(andExpression, null);PersistenceManagerSvr pms = (PersistenceManagerSvr) InvocationHandlerFwd.getInterfaceObject(PersistenceManagerSvr.class);QueryResult qr = pms.query(queryspec);}	  SELECT A0.*, A1.* FROM WTPART A0, WTPARTMASTER A1 WHERE (A0.IDA2A2 = 4638)AND(A1.IDA2A2 = A0.IDA3MASTERREFERENCE);

说明[one]:SQL语句写查询语句时,可以为被查询的表、视图指定别名。在使用QuerySpec进行高级查询时,也可以指定别名,别名分为两个部分:前缀+序号,我们能够进行修改的部分

只是前缀,并且必须在为QuerySpec扩展类列表(queryspec.appendClassList(WTPart.class, true);)之前设置别名(queryspec.getFromClause().setAliasPrefix("B");)

序号部分是在扩展类列表时自动产生的,第一类的别名为"前缀+0",第二个为"前缀+1",第三个为"前缀+2",依次类推。

wt.pom.checkAdvancedQueryAccess=false 

    说明[two]:从前面的例子可以看出,进行这些查询所返回的结果要么是整个类,要么是这些类的常量属性的值所对应的列.我们如果要想获取某个对象所对应记录的任何向量的值时,应该

怎么做呢?

在进行QuerySpec查询时,设置 setAdvancedQueryEnabled(true);由于该方法所设置的属性advancedQueryEnabledtransient,是不能够被序列化的,因此进行了这种设置的

查询必须要在服务端运行。

queryspec.appendClassList(WTPart.class, false); queryspec.appendSelect(tablecolumn0, false);的第二个参数需为falseQuerySpec queryspec = new QuerySpec();queryspec.setAdvancedQueryEnabled(true);		//如果不直接在服务端运行,那么该段代码就不会生效int a = queryspec.appendClassList(WTPartMaster.class, false);String aliases[] = new String[2];aliases[0] = queryspec.getFromClause().getAliasAt(a);TableColumn tc0 = new TableColumn(aliases[0], "IDA2A2");queryspec.appendSelect(tc0, false);//TableColumn tc1 = new TableColumn();//tc1.setColumnName(rownum);//queryspec.appendWhere(new SearchCondition(tc1, "<", new ConstantExpression(new Long(5))));	//用来指定返回的行数

复合查询(子查询)

{String aliases[] = new String[2];QuerySpec queryspec = new QuerySpec();QuerySpec subqueryspec = new QuerySpec();subqueryspec.setAdvancedQueryEnabled(true); //--------------------------------------------------------------------int a = subqueryspec.appendClassList(WTPartMaster.class, false);aliases[0] = subqueryspec.getFromClause().getAliasAt(a);TableColumn tc0 = new TableColumn(aliases[0], "IDA2A2");subqueryspec.appendSelect(tc0, false); 				TableColumn tc1 = new TableColumn(null, "rownum"); 		subqueryspec.appendWhere(new SearchCondition(tc1, "<", new ConstantExpression(new Long(5))));//--------------------------------------------------------------------int b = queryspec.appendFrom(new SubSelectExpression(subqueryspec));aliases[1] = queryspec.getFromClause().getAliasAt(b);TableColumn tc2 = new TableColumn(aliases[1], "*");TableColumn tc3 = new TableColumn(null, "'我是一个兵,来自'");queryspec.appendSelect(tc2, false);queryspec.appendSelect(tc3, false);}	SELECT * FROM (SELECT IDA2A2 FROM WTPARTMASTER WHERE ROWNUM<5) A;

高级查询(函数使用)

SELECT SUM(A0.IDA2A2) FROM WTPART

方法一:{QuerySpec qs = new QuerySpec();                 //new一个新的查询qs.setAdvancedQueryEnabled(true);               //打开查询int a = qs.appendFrom(new ExternalTableExpression("GZMTRECR"));//from wtpart指定查询的表String[] aliases = new String[1];aliases[0] = qs.getFromClause().getAliasAt(a);//得到所有的结果TableColumn tc0 = new TableColumn(null, "SUM(" + aliases[0] + ".gzmtrbudgetchange) as Total");qs.appendSelect(tc0, false);                     //关闭查询}方法二:{QuerySpec qs = new QuerySpec();qs.setAdvancedQueryEnabled(true);int a = qs.appendFrom(new ExternalTableExpression("GZMTRECR"));String[] aliases = new String[1];aliases[0] = qs.getFromClause().getAliasAt(a);TableColumn tc0 = new TableColumn(aliases[0], "gzmtrbudgetchange");SQLFunction sf0 = SQLFunction.newSQLFunction(SQLFunction.SUM);	//指定函数sf0.setArgumentAt(tc0, 0);							//为函数设置参数qs.appendSelect(tc0, false);}进行函数处理时的常见的写法:SELECT SUBSTRING(CLASSNAMEA2,0,14) FROM WTPART{QuerySpec qs = new QuerySpec();qs.setAdvancedQueryEnabled(true);int a = qs.appendFrom(new ExternalTableExpression("GZMTRECR"));String[] aliases = new String[1];aliases[0] = qs.getFromClause().getAliasAt(a);TableColumn tc0 = new TableColumn(aliases[0], "CLASSNAMEA2,0,14");SQLFunction sf0 = SQLFunction.newSQLFunction(SQLFunction.SUB_STRING);	//指定函数sf0.setArgumentAt(tc0, 0);								//为函数设置参数qs.appendSelect(tc0, false);}在进行查询时,有两种方式:
PersistenceServerHelper.manager.query()	//不能够进行远程调用;不自动检查权限;如果需要检查权限,需要指定权限检查的处理类
PersistenceHelper.manager.find()		//可以远程调用;自动会检查权限;其实find()和query()使用同样的方式进行查询,只不过使用find()进行查询时,自动指定权限检查处理类

这篇关于【Windchill高级查询感悟笔记】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066023

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可