查询很可能是罪魁祸首;您必须检查它在数据库上的执行情况,而与应用程序无关。检查索引和执行计划,看看瓶颈可能在哪里。
对于您的代码,首先我将确保使用
local
范围将查询范围限定到函数。然后,您可以使用内置函数将查询数据序列化为 JSON,但具体方式取决于您使用的 ColdFusion 版本。
<cfscript>
news = queryNew("id,title", "integer,varchar");
queryAddRow(news);
querySetCell(news, "id", "1");
querySetCell(news, "title", "Dewey Defeats Truman");
queryAddRow(news);
querySetCell(news, "id", "2");
querySetCell(news, "title", "Men walk on Moon");
writeDump(serializeJSON(news, "struct"));
</cfscript>
这将返回一个使用名称/值对的 JSON 对象数组。
[
{
"ID": 1,
"TITLE": "Dewey Defeats Truman"
},
{
"ID": 2,
"TITLE": "Men walk on Moon"
}
]
如果您为数据库列名称添加别名,则可以轻松创建 JSON 输出中指示的键。您可能需要调整读取键名称的代码以匹配函数返回的大小写。
<cffunction name="GeTheSerialNumber" access="remote" returnformat="plain" returntype="string" output="no">
<cfargument name="term" required="yes" />
<cfsetting requesttimeout="20"/>
<cfif NOT IsDefined("session.LoggedIn")>
<cfabort />
</cfif>
<cfquery name="local.GetSerialNumber" datasource="#application.datasource#">
SELECT
[serialNum] as label
, [serialNum] as [value]
, MissionAsset.MissionAssetID as missionAssetID
, MissionAssetDescription as missionAssetDescription
, ESN.EfracusSerialNumberID as ID
FROM MissionAsset
LEFT JOIN EfracusSerialNumber ESN ON MissionAsset.MissionAssetID = ESN.MissionAssetID
WHERE MissionAsset.isActive = <cfqueryparam value="1" cfsqltype="cf_sql_bit">
AND serialNum LIKE <cfqueryparam value="%#arguments.term#%" cfsqltype="cf_sql_varchar">
AND MissionAssetStatusID IN (2,3,4,5,6)
ORDER BY serialNum
</cfquery>
<cfreturn serializeJSON(local.GetSerialNumber, "struct")>
</cffunction>
如果你想要更精细的控制,你可以尝试
[ArrayCollection.cfc][1]
我为旧版本的ACF整理的。