ColdFusion 9の関数Duplicate
は、元の変数を参照することなく、変数のディープコピーとも呼ばれるクローンを返すことになっています。これは、構造やクエリなどの複雑なオブジェクトに当てはまります。ColdFusionの重複関数はクエリのメタデータをコピーしません
私は、アプリケーションスコープ内にあるクエリオブジェクトを使用するコードを作成しています。このクエリは、特定のページで使用するためにローカルで変更する必要があり、元のクエリ文字列(クエリオブジェクトのメタデータ内にあるもの)が何であるかを知る必要があります。この場合、元のクエリの完全なコピーを作成することが最も賢明な解決策です。
残念ながら、ColdFusionはオブジェクト全体をクローン化せず、その結果セットのみをクローンしてすべてのメタデータを失うようです。
これは、私がDuplicate
から期待した動作ではないため、他の種類の複雑なオブジェクトを複製するときに起こることと一貫していません。
私の問題の解決策の1つは、結果セットと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関数は
getMetaData(qry)
です。 - と
getMetaData(qry)
の両方をアプリケーションスコープに保存して問題を修正しました。
(編集)ドキュメントには、関連性のある可能性のあるJavaオブジェクトを複製することはできないというメモがあります。だから、オブジェクトの一部がJavaオブジェクトで構成されていれば、オブジェクト全体のコピーを保証するものではないと思います。 – Leigh
元のクエリで何を変更していますか?元のクエリのメタデータを使用して複製クエリを変更できますか? –
Leigh - 私は、CFの特定の型(問合せのようなもの)をCFであり、Javaのクラスやオブジェクトではないと考えていると思います。しかしそれは雑草でかなり下にありますので、おそらくあなたはそれについて正しいでしょう。 –