Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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
Java 从hibernate更新并返回列表(使用sql查询)_Java_Sql_Hibernate - Fatal编程技术网

Java 从hibernate更新并返回列表(使用sql查询)

Java 从hibernate更新并返回列表(使用sql查询),java,sql,hibernate,Java,Sql,Hibernate,我有一个更新(表1)和插入(表2)的查询,并在末尾返回一个由查询更新的ID列表 当我从sql运行它时,它运行正常。 但是当我从代码运行时,它返回受影响的id,但不更新行 这是因为我是按以下方式执行的:namedQuery.list() SQL查询: step 1: create table variable step 2: update table1 step 3: store "Output Into" table variable; insert table variable content

我有一个更新(表1)和插入(表2)的查询,并在末尾返回一个由查询更新的ID列表

当我从sql运行它时,它运行正常。 但是当我从代码运行时,它返回受影响的id,但不更新行

这是因为我是按以下方式执行的:
namedQuery.list()

SQL查询:

step 1: create table variable
step 2: update table1
step 3: store "Output Into" table variable; insert table variable content into table2 
step 4: retrun affected rows (table variable column)
下面是sql:

Declare @tempHistoryTable Table(
    AG_TASK_ID int,Fulfillment_Request_ID int,Task_Type_ID int,Task_Status varchar(25)
    ,CF_System_User_ID int,Modified_By_System_User_ID int,AG_Task_Date datetime,row_version int
    )

    Declare @infoNeeded int,
                    @reviewResult int,
                    @researcherClass varchar(20),
                    @infoNeededReview int;

    Update ag_task Set task_status = case when task_status = 'awaitingHitEntry' or task_status = 'Uploaded' 
    then task_status when (data_source = 'New_Jersey' or data_source = 'Illinois') and :action = 'Assign'
    then 'sentForProcessing' else 'New' end
    ,db_version = case when db_version is null then 0 else db_version + 1 end
    ,modified_by_system_user_id = :assignedBy
    ,system_user_id = :assigningTo
    ,bpm_version = db_version
    ,task_type_id = case when task_type_id = @infoNeeded and :action = 'Assign'
    then @reviewResult
    when task_type_id = @infoNeeded and @researcherClass != 'External'
    then @reviewResult
    when (task_type_id = @infoNeededReview or task_type_id = @reviewResult) and @researcherClass = 'External'
    then @infoNeeded
    else task_type_id end
    ,creation_date = case when (task_type_id = @infoNeededReview or task_type_id = @reviewResult) and @researcherClass = 'External'
    then getDate() else creation_date end
    ,task_assigned_date = case when :assigningTo is null then null else GETDATE() end

    Output inserted.ag_task_id,inserted.Fulfillment_Request_ID,inserted.Task_Type_ID
    ,inserted.Task_Status,inserted.system_user_id
    ,inserted.Modified_By_System_User_ID,getdate(),inserted.row_version

    Into @tempHistoryTable
    Where fulfillment_request_id in (:fulfillmentRequestIds) and completion_date is null and 
    1 = case when data_source in ('New_Jersey', 'Illinois') and processing_date is null then 2 else 1 end
    and 1 = case when :action = 'Claim' and system_user_id is not null then 2 else 1 end
    and 1 = case when system_user_id is null and :assigningTo is null then 2 else 1 end

    insert into AG_TASK_HISTORY (
        AG_TASK_ID
        ,Fulfillment_Request_ID
        ,Task_Type_ID
        ,Task_Status
        ,CF_System_User_ID
        ,Modified_By_System_User_ID
        ,AG_Task_Date
        ,row_version
    ) 
    SELECT AG_TASK_ID
        ,Fulfillment_Request_ID
        ,Task_Type_ID
        ,Task_Status
        ,CF_System_User_ID
        ,Modified_By_System_User_ID
        ,AG_Task_Date
        ,row_version 
        from @tempHistoryTable

    select Fulfillment_Request_ID from @tempHistoryTable
这就是我调用代码的方式:

String queryName = AgTask.class.getName () + ".claimAssignTasks";
    final Query namedQuery = getNamedQuery ( queryName );
    logger.debug("assigningTo: "+assigningTo);
    logger.debug("assignedBy: "+assignedBy);
    logger.debug("action: "+action);
    logger.debug("fulfillmentRequestIdList: "+fulfillmentRequestIdList);
    namedQuery.setParameterList("fulfillmentRequestIds", fulfillmentRequestIdList);
    namedQuery.setParameter("assigningTo", assigningTo);
    namedQuery.setParameter("assignedBy",assignedBy);
    namedQuery.setParameter("action",action);
    logger.debug("Query: "+namedQuery.getQueryString());
    List<Integer> frIdList = new ArrayList<Integer>();
    frIdList = namedQuery.list();
String queryName=AgTask.class.getName()+“.clairsigntasks”;
最终查询namedQuery=getNamedQuery(queryName);
logger.debug(“assigningTo:+assigningTo”);
logger.debug(“assignedBy:+assignedBy”);
logger.debug(“操作:+操作”);
debug(“fulfillmentRequestIdList:+fulfillmentRequestIdList”);
namedQuery.setParameterList(“FulfillmentRequestId”,FulfillmentRequestId列表);
setParameter(“assigningTo”,assigningTo);
namedQuery.setParameter(“assignedBy”,assignedBy);
namedQuery.setParameter(“action”,action);
debug(“查询:+namedQuery.getQueryString());
List frIdList=新建ArrayList();
frIdList=namedQuery.list();
这就是我运行测试的方式(正确更新并插入数据库中的表):

@测试
public void TestClaimersignTasks(){
transactionTemplate.execute(新建TransactionCallbackWithoutResult()
{
public void doInTransactionWithoutResult(交易状态arg0)
{
Set frIds=new HashSet();
frIds.add(190195);
frIds.add(190257);
frIds.add(190243);
frIds.add(190205);
//java.util.List frIdList=
java.util.List-frIdList=agTaskSearchDao.clairsigntasks(frIds,846846,“重新分配”);
log.info(“集合大小:+frIdList.size());
for(整数fullmentRequestId:frIdList){
log.debug(“fulfillmentRequestId:+fulfillmentRequestId”);
}
}
});
}

首先,我认为将如此复杂的查询放到Hibernate/JPA的上下文中是一个非常糟糕的主意。如果我是你,我会尝试分析sql并将其分解,以查看这是否可以通过借用JPA/Hibernate功能更干净地解决。或者,也许你最终会放弃整个事情,用不同的方法解决手头的问题


也就是说,如果您想要执行一个SQL(或HQL/JPQL)来更改数据库的状态,您需要使用查询接口的方法
executeUpdate()
,而不是仅用于检索数据的
list()
uniqueResult()

显示您正在使用的查询语法请提供尽可能多的详细信息,包括您正在调用的实际代码。我想您可能需要在保存/更新后在hibernate上刷新/提交会话。您还可以检查hibernate更新后是否有值反映在数据库中吗?请发布有效代码。这是一个批量更新操作。我所说的工作是指它正确更新和插入记录,并返回正确的输出。但当我通过部署我的应用程序通过tomact服务器运行它时,它返回正确的输出,但不更新并在表中插入记录。嗯,这有点奇怪,但可能是tomcat服务器使用的类与运行测试时使用的类不同,以及list()-方法(或调用链下游使用的方法)项目的依赖项和tomcat使用的依赖项不同。如果使用maven,则提供作用域的依赖项声明应用程序仅应在开发期间使用此依赖项,对于部署,该依赖项由app-server提供。在我将驱动程序从jdt更改为sql驱动程序后,它对我有效。顺便说一句,我创建了一个过程,而不是保留一个简单的sql
@Test
public void testclaimAssignTasks(){
    transactionTemplate.execute(new TransactionCallbackWithoutResult ()
    {
        public void doInTransactionWithoutResult (TransactionStatus arg0)
        {
            Set<Integer> frIds = new HashSet<Integer>();
            frIds.add(190195);
            frIds.add(190257);
            frIds.add(190243);
            frIds.add(190205);
            //java.util.List<Integer> frIdList = 
            java.util.List<Integer> frIdList = agTaskSearchDao.claimAssignTasks(frIds,846,846,"Reassign");
            log.info("collection size: "+frIdList.size());
            for(Integer fulfillmentRequestId : frIdList){
                log.debug("fulfillmentRequestId: "+fulfillmentRequestId);
            }
        }

    });
}