Sql Coldfusion、Coldbox、Hibernate:使用Subselect进行查询
我在一个项目上遇到了麻烦,我正在向社区寻求帮助 在开始之前,我会说我对ColdFusion不太熟悉(12年前我把它弄得一团糟,我知道它从那时起就进化了),我对Coldbox或Hibernate一点也不熟悉 我有一个Coldbox处理程序(如下所示),它从数据库中提取事件实体列表,并以JSON格式返回。目前,这工作正常(问题区域之外的所有内容)。然而,我们现在需要通过另一个称为Quantifications的表来过滤事件列表。基本上,我需要匹配a)具有与之相关联的量化和b)具有至少一个状态为“活动”的量化的所有事件 我有一些合乎逻辑的方法来处理这个问题。第一个(也是不理想的)是简单地获取我的所有结果,然后在一组循环中过滤它们。然而,这是昂贵的,并且会干扰分页,所以我放弃了这个想法 第二种方法是对Quantifications表进行联接,返回所有活动的Quantifications和与之对应的事件。但是,我遇到了重复项,Coldbox的Sql Coldfusion、Coldbox、Hibernate:使用Subselect进行查询,sql,hibernate,coldfusion,coldbox,Sql,Hibernate,Coldfusion,Coldbox,我在一个项目上遇到了麻烦,我正在向社区寻求帮助 在开始之前,我会说我对ColdFusion不太熟悉(12年前我把它弄得一团糟,我知道它从那时起就进化了),我对Coldbox或Hibernate一点也不熟悉 我有一个Coldbox处理程序(如下所示),它从数据库中提取事件实体列表,并以JSON格式返回。目前,这工作正常(问题区域之外的所有内容)。然而,我们现在需要通过另一个称为Quantifications的表来过滤事件列表。基本上,我需要匹配a)具有与之相关联的量化和b)具有至少一个状态为“活动
resultTransformer
实际上似乎没有工作-DISTINCT\u ROOT\u ENTITY
没有返回DISTINCT实体。(我也严重缺乏代码引用,而且我没有一种方法可以轻松地逐步完成代码。)
我的最后一个想法是——对于每个事件,对Quantifications表进行子查询,查找与该事件相关联的量化,然后统计有多少活动。如果计数为正,则返回事件
如何使用Coldbox和Hibernate使其工作?我知道我想做什么(以及如何从逻辑上解决问题),但我对如何在这个系统中使用这些工具和这种语法知之甚少,不幸的是,我几乎没有时间去弄清楚。谢谢大家!
<cfscript>
component extends="handlers._jsonApi" {
property name='statusService' inject='entityService:EventStatus';
property name='departmentService' inject='entityService:Department';
property name='myEventService' inject='id:myEventService';
property name='quantificationService' inject='entityService:Quantification';
///api/v1/events?departmentId=[XXX]&date=[2013-08-02]&showEventsWithoutQuantifications[false|true]
function index(event,rc,prc){
var myEventCriteria = myEventService.newCriteria();
//if a date is passed, display events occuring that date
if (StructKeyExists(rc, "date")){
if (isDate(rc.date)){
var date = createODBCDateTime(rc.date);
} else {
addMessage("The date passed (#rc.date#) is invalid. The date must be in the following format: YYYY-MM-DD.", "error");
return;
}
} else {//else display events occurring today
var date = createODBCDateTime(now());
}
myEventCriteria.le("startDate", date);
myEventCriteria.ge("endDate", date);
//if a department id is passed, restrict events to that department
if (( StructKeyExists(rc, "departmentId")) AND (len(rc.departmentId))){
var departmentId = rc.departmentId;
var department = departmentService.findWhere(entityName="Department", criteria={departmentId=departmentId});
if (isNull(department)){
addMessage("'#rc.departmentId#' is not a valid departmentId.", "error");
return;
}
myEventCriteria.isEq("department", department);
}
var showEventsWithoutQuantifications = false;
if (StructKeyExists(rc, "showEventsWithoutQuantifications")){
if (rc.showEventsWithoutQuantifications) showEventsWithoutQuantifications = true;
}
if (NOT showEventsWithoutQuantifications){
myEventCriteria.isNotEmpty('quantifications');
}
/* PROBLEM AREA */
// Filter events to only include those that have approved quantifications.
var statusId = 150;
var status = statusService.findWhere(entityName="EventStatus", criteria={eventStatusOrder=statusId});
myEventCriteria.createAlias("quantifications", "qt").isEq("qt.status", status);
myEventCriteria.withProjections(countDistinct="eventID");
myEventCriteria.resultTransformer( myEventCriteria.DISTINCT_ROOT_ENTITY );
/* // PROBLEM AREA */
var recordCount = myEventCriteria.count();
//the order needs to be set after the count is retrieved, or it returns an error
//myEventCriteria.order('startDate', 'asc');
myEventCriteria.order('eventID', 'asc');
var pageSize = getSetting("defaultPageSize");
if (StructKeyExists(rc, "pageSize") AND Len(rc.pageSize)) pageSize = rc.pageSize;
myEventCriteria.maxResults(pageSize);
if (recordCount GT pageSize){
var firstResult = 0;
var pageNumber = 1;
var pageCount = Ceiling(recordCount / pageSize);
if (StructKeyExists(rc, "pageNumber") AND Len(rc.pageNumber)){
pageNumber = rc.pageNumber;
if (pageNumber LT 0 OR pageNumber GT pageCount){
addMessage("The pageNumber must be between 1 and #pageCount#", "error");
return;
}
firstResult = (pageNumber - 1) * pageSize;
myEventCriteria.firstResult(firstResult);
}
var paging = StructNew();
paging['pageSize'] = pageSize;
paging['pageNumber'] = pageNumber;
paging['pageCount'] = pageCount;
paging['recordCount'] = recordCount;
prc.response['paging'] = paging;
}
prc.response['events'] = objectsToStructs(myEventCriteria.list(), "eventID,eventName,eventCity,eventState,eventVenue,startDate,endDate,justfication,department.departmentID,department.departmentName,country.countryID,country.countryCode,country.countryName,country.countryRegion,signInSummary.signInSummaryID,signInSummary.signInSummary,serviceType.serviceTypeID,serviceType.serviceTypeName" );
}//end index
}//end component
</cfscript>
component extends=“handlers.\u jsonApi”{
属性名称='statusService'注入='entityService:EventStatus';
属性名称='departmentService'inject='entityService:Department';
属性名称='myEventService'inject='id:myEventService';
属性名称='quantificationService'inject='entityService:Quantification';
///api/v1/events?部门ID=[XXX]&日期=[2013-08-02]&未量化的ShowEvents[假|真]
功能索引(事件、rc、prc){
var myEventCriteria=myEventService.newCriteria();
//如果已传递日期,则显示发生该日期的事件
如果(结构键存在(rc,“日期”)){
如果(isDate(rc.日期)){
var date=createODBCDateTime(rc.date);
}否则{
addMessage(“传递的日期(#rc.date#)无效。日期必须采用以下格式:YYYY-MM-DD.,“错误”);
返回;
}
}else{//else显示今天发生的事件
var date=createODBCDateTime(now());
}
myEventCriteria.le(“起始日期”,日期);
myEventCriteria.ge(“结束日期”,日期);
//如果传递了部门id,则将事件限制到该部门
如果((StructKeyExists(rc,“departmentId”))和(len(rc.departmentId))){
var departmentId=rc.departmentId;
var department=departmentService.findWhere(entityName=“department”,criteria={departmentId=departmentId});
if(isNull(部门)){
addMessage(“rc.departmentId”不是有效的departmentId。”,“error”);
返回;
}
myEventCriteria.isEq(“部门”,部门);
}
var showEventsWithoutQuantifications=false;
如果(StructKeyExists(rc,“showEventsWithoutQuantifications”)){
如果(rc.showEventsWithoutQuantifications)showEventsWithoutQuantifications=true;
}
如果(不显示未量化的事件){
myEventCriteria.isNotEmpty(“量化”);
}
/*问题领域*/
//筛选事件以仅包括已批准量化的事件。
var statusId=150;
var status=statusService.findWhere(entityName=“EventStatus”,条件={eventStatusOrder=statusId});
myEventCriteria.createAlias(“量化”、“qt”).isEq(“qt.status”,status);
myEventCriteria.with projections(countDistinct=“eventID”);
结果变压器(myEventCriteria.DISTINCT_ROOT_ENTITY);
/*//问题区域*/
var recordCount=myEventCriteria.count();
//检索计数后需要设置顺序,否则返回错误
//myEventCriteria.order('startDate','asc');
myEventCriteria.order('eventID','asc');
var pageSize=getSetting(“defaultPageSize”);
如果(StructKeyExists(rc,“pageSize”)和Len(rc.pageSize))pageSize=rc.pageSize;
最大结果(页面大小);
if(recordCount GT pageSize){
var firstResult=0;
var pageNumber=1;
var pageCount=上限(记录计数/页面大小);
if(StructKeyExists(rc,“pageNumber”)和Len(rc.pageNumber)){
pageNumber=rc.pageNumber;
如果(页码LT 0或页码GT pageCount){
addMessage(“页码必须介于1和#pageCount#”之间,即“错误”);
返回;
}
firstResult=(页码-1)*页面大小;
myEventCriteria.firstResult(firstResult);
}
var paging=StructNew();
分页['pageSize']=pageSize;
分页['pageNumber']=页码;
分页['pageCount']=pageCount;
分页['recordCount']=recordCount;
prc.响应['paging']=寻呼;
}
prc.response['events']=objectsToStructs(myEventCriteria.list(),“eventID,eventName,eventCity,