Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Coldfusion、Coldbox、Hibernate:使用Subselect进行查询_Sql_Hibernate_Coldfusion_Coldbox - Fatal编程技术网

Sql Coldfusion、Coldbox、Hibernate:使用Subselect进行查询

Sql Coldfusion、Coldbox、Hibernate:使用Subselect进行查询,sql,hibernate,coldfusion,coldbox,Sql,Hibernate,Coldfusion,Coldbox,我在一个项目上遇到了麻烦,我正在向社区寻求帮助 在开始之前,我会说我对ColdFusion不太熟悉(12年前我把它弄得一团糟,我知道它从那时起就进化了),我对Coldbox或Hibernate一点也不熟悉 我有一个Coldbox处理程序(如下所示),它从数据库中提取事件实体列表,并以JSON格式返回。目前,这工作正常(问题区域之外的所有内容)。然而,我们现在需要通过另一个称为Quantifications的表来过滤事件列表。基本上,我需要匹配a)具有与之相关联的量化和b)具有至少一个状态为“活动

我在一个项目上遇到了麻烦,我正在向社区寻求帮助

在开始之前,我会说我对ColdFusion不太熟悉(12年前我把它弄得一团糟,我知道它从那时起就进化了),我对Coldbox或Hibernate一点也不熟悉

我有一个Coldbox处理程序(如下所示),它从数据库中提取事件实体列表,并以JSON格式返回。目前,这工作正常(问题区域之外的所有内容)。然而,我们现在需要通过另一个称为Quantifications的表来过滤事件列表。基本上,我需要匹配a)具有与之相关联的量化和b)具有至少一个状态为“活动”的量化的所有事件

我有一些合乎逻辑的方法来处理这个问题。第一个(也是不理想的)是简单地获取我的所有结果,然后在一组循环中过滤它们。然而,这是昂贵的,并且会干扰分页,所以我放弃了这个想法

第二种方法是对Quantifications表进行联接,返回所有活动的Quantifications和与之对应的事件。但是,我遇到了重复项,Coldbox的
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,