【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

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现