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

Xev*_*jol 6 coldfusion pass-by-value coldfusion-9

DuplicateColdFusion 9 的功能应该返回一个变量的克隆,也称为深拷贝,而不引用原始变量.对于复杂的对象,例如结构和查询,这应该是正确的.

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

但不幸的是,看起来ColdFusion并不是克隆整个对象,而只是克服其结果集,从而丢失了所有元数据.

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

我的问题的一个解决方案是将结果集和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" />
Run Code Online (Sandbox Code Playgroud)

查询,副本及其深层副本


编辑:

简而言之,这些是我到目前为止的结论:

  • 元数据不会重复,因为它qry.getMetaData()是一个JAVA类,并且如文档中所述,如果数组元素或结构字段是COM,CORBA或JAVA对象,则不能复制数组或结构.
  • 记录的ColdFusion函数用于获取查询的元数据getMetaData(qry).
  • 我已经通过存储两个固定我的问题qry,并getMetaData(qry)在应用范围.

Mar*_*ger 2

嗯......这对我来说是一个错误。我的猜测是,存在对未拉入深层副本的元数据的引用。如果是其他情况,则在深层复制上调用的“getMetaData()”函数将引发错误。

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

<cfquery name="qry" datasource="mydatasource" result="myresult">
    SELECT "blue" AS colour, "pear" as fruit
</cfquery>
Run Code Online (Sandbox Code Playgroud)

这可能会创建嵌入结果集中的属性或类 - 尽管我相信“结果”实际上是在变量范围中设置的。我需要考虑一下。