ColdFusion的复制函数不会复制查询的元数据

ColdFusion的复制函数不会复制查询的元数据,coldfusion,coldfusion-9,pass-by-value,Coldfusion,Coldfusion 9,Pass By Value,ColdFusion 9的函数应该返回变量的克隆(也称为深度副本),而不引用原始变量。对于复杂对象,如结构和查询,应该是这样的 我正在编写一个使用应用程序范围内的查询对象的代码。这个查询需要在本地修改,以便在特定页面中使用,我需要知道查询对象元数据中的原始查询字符串是什么。因此,在这种情况下,创建原始查询的深度副本是最明智的解决方案 但不幸的是,ColdFusion似乎并没有克隆整个对象,而是只克隆其结果集,从而丢失了所有元数据 这不是我期望的复制行为,我发现它与复制其他类型的复杂对象时发生的情

ColdFusion 9的函数应该返回变量的克隆(也称为深度副本),而不引用原始变量。对于复杂对象,如结构和查询,应该是这样的

我正在编写一个使用应用程序范围内的查询对象的代码。这个查询需要在本地修改,以便在特定页面中使用,我需要知道查询对象元数据中的原始查询字符串是什么。因此,在这种情况下,创建原始查询的深度副本是最明智的解决方案

但不幸的是,ColdFusion似乎并没有克隆整个对象,而是只克隆其结果集,从而丢失了所有元数据

这不是我期望的复制行为,我发现它与复制其他类型的复杂对象时发生的情况不一致

我的问题的一个解决方案是将结果集和sql字符串作为单独的参数传递给函数

但是,我想知道您是否有一个更优雅的解决方案,和/或对查询重复问题有一点了解

下面是一些证明查询重复问题的代码:

<cfquery name="qry" datasource="mydatasource">
    SELECT "blue" AS colour, "pear" as fruit
</cfquery>
<cfset qry_copy = qry>
<cfset qry_deepcopy = duplicate(qry)>

<cfdump var="#qry#" label="Original query" />
<cfdump var="#qry_copy#" label="Copy of the query (by reference)" />
<cfdump var="#qry_deepcopy#" label="Deep copy of the query (by value)" />

<cfdump var="#qry.getMetaData().getExtendedMetaData()#" label="Metadata of the original query" />
<cfdump var="#qry_copy.getMetaData().getExtendedMetaData()#" label="Metadata of the copy of the query" />
<cfdump var="#qry_deepcopy.getMetaData().getExtendedMetaData()#" label="Metadata of the deep copy of the query" />
编辑:

简而言之,到目前为止,我的结论如下:

元数据不会被复制,因为qry.getMetaData是一个JAVA类,如文档中所述,如果数组元素或结构字段是COM、CORBA或JAVA对象,则不能复制数组或结构。 有文档记录的获取查询元数据的ColdFusion函数是getMetaDataqry。 通过在应用程序范围中存储qry和getMetaDataqry,我已经修复了我的问题。
嗯。。。这就是我对臭虫的看法。我的猜测是,有一个对元数据的引用没有被拉入深度副本中。如果是其他内容,则对深度副本调用的getMetaData函数将抛出错误

您是否尝试将结果属性添加到查询标记中?例如:

<cfquery name="qry" datasource="mydatasource" result="myresult">
    SELECT "blue" AS colour, "pear" as fruit
</cfquery>

这可能会创建一个嵌入到结果集中的属性或类,尽管我认为结果实际上是在变量范围内设置的。我需要考虑一下这一点。

Edit文档中有一条说明,您不能复制可能相关的java对象。因此,我不认为它能保证复制整个对象,如果它的一部分由java对象组成。Leigh-我想我会认为任何函数借用到CF特定类型,就像在查询中一样,是CF而不是java类或对象。但是,它已经很落后了,所以你可能是对的。这些都是有趣的阅读,但是,正如Scott所提到的,原始查询的sql仍然可以从该对象获得。如果每次都不一样,并且在应用程序范围内,您可能会做一些可怕的事情。您调用的是查询类的内部方法,而不是ColdFusion的getMetadata函数。这些内部方法不应该直接使用,因此所有关于内置CFML函数如何处理它们的赌注都没有。@XeviPujol-最有可能,但正如我在删除的注释中提到的,它也是您正在使用的一种未记录的方法,所以无论如何都不能保证它。无论在哪里运行初始查询,您可以简单地将“结果”复制到application scope.Scott,但随后必须单独复制它。但这是解决问题的办法。也许Application.qryMeta[queryname]=结果。。。。在您的示例中,对象myresult包含与qry.getMetaData.getExtendedMetaData相同的信息。因此,我认为通过myresult访问这些信息要好得多,因为它是ColdFusion的包装器,用于从Java类获取信息。然后,我可以将qry和myresult存储在应用程序中,并在我的页面中分别复制它们。