2014-01-09 14 views
6

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" /> 

A query, its copy and its deep copy


編集:一言で言えば

、これらはこれまでのところ、私の結論です:

  • qry.getMetaData()がJAVAクラスで、ドキュメントに記載されているように、メタデータが重複しない配列要素または構造体フィールドがCOM、CORBA、またはJAVAオブジェクトの場合、配列または構造体を複製することはできません
  • クエリのメタデータを取得するために文書化されているColdFusion関数はgetMetaData(qry)です。
  • getMetaData(qry)の両方をアプリケーションスコープに保存して問題を修正しました。
+2

(編集)ドキュメントには、関連性のある可能性のあるJavaオブジェクトを複製することはできないというメモがあります。だから、オブジェクトの一部がJavaオブジェクトで構成されていれば、オブジェクト全体のコピーを保証するものではないと思います。 – Leigh

+0

元のクエリで何を変更していますか?元のクエリのメタデータを使用して複製クエリを変更できますか? –

+1

Leigh - 私は、CFの特定の型(問合せのようなもの)をCFであり、Javaのクラスやオブジェクトではないと考えていると思います。しかしそれは雑草でかなり下にありますので、おそらくあなたはそれについて正しいでしょう。 –

答えて

2

うん...これは私の考え方のバグです。私の推測では、深いコピーに引き込まれていないメタデータへの参照があると考えられます。それが他のものだった場合、ディープ・コピーで呼び出された「getMetaData()」関数はエラーをスローします。

"result"属性をクエリタグに追加しようとしましたか? "結果"は実際には私が信じる変数の範囲に設定されていますが、結果セットに埋め込まれたプロパティまたはクラスが作成される可能性があります。私はこれについて考える必要があります。

+0

最初のクエリが実行される場所であれば、「結果」をアプリケーションスコープにコピーするだけで済みます。 –

+1

Scottが、別にそれを複製する必要があります。しかし、それはそのトリックを行う回避策です。おそらくApplication.qryMeta [queryname] =結果....彼はそれを一致させることができる何か。 –

+0

あなたの例では、オブジェクト 'myresult'は' qry.getMetaData()。getExtendedMetaData() 'と同じ情報を含んでいます。 Javaクラスから情報を取得するためのColdFusionのラッパーであるため、この情報に 'myresult'を使ってアクセスする方がはるかに良いと言えます。 これで、 'qry'と' myresult'の両方をAPPLICATIONに保存し、それらを私のページに別々に複製することができます。 –

関連する問題