【问题标题】:Update and return list from hibernate (using sql query)从休眠更新和返回列表(使用 sql 查询)
【发布时间】:2013-09-23 15:32:06
【问题描述】:

我有一个查询,它更新 (table1) 并插入到 (table2) 中,并在末尾返回一个已被查询更新的 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();

这就是我运行测试的方式(正确更新并插入到我的数据库中的表中):

@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);
            }
        }

    });
}

【问题讨论】:

  • 显示您正在使用的查询语法
  • 请提供尽可能详细的信息,包括您调用的实际代码。
  • 我猜你可能需要在保存/更新后在休眠状态下刷新/提交会话。您是否还可以检查休眠更新后是否有值反映在数据库中?
  • 请发布有效代码..
  • 这是一个批量更新操作。

标签: java sql hibernate


【解决方案1】:

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

话虽如此,如果你想执行一个应该改变数据库状态的 SQL(或 HQL/JPQL),你需要使用 Query 接口的 executeUpdate() 方法,而不是 @ 987654322@ 或 uniqueResult() 仅用于检索数据。

【讨论】:

  • 工作是指它正确更新和插入记录并返回正确的输出。但是,当我通过部署我的应用程序通过 tomact 服务器运行它时,它会返回正确的输出,但不会更新并将记录插入表中。
  • 嗯,这有点奇怪,但可能是 tomcat 服务器使用的类与您在运行测试时使用的类不同,并且 list() 方法(或在调用之后使用的方法) -chain) 的不同之处在于项目的依赖项和tomcat 使用的依赖项。如果您使用 maven,则提供范围的依赖项表明应用程序仅在开发期间应使用此依赖项,对于部署,依赖项由应用服务器提供。
  • 在我将驱动程序从 jdt 更改为 sql 驱动程序后,它对我有用。顺便说一句,我创建了一个过程而不是保留一个普通的 sql。
  • 感谢大家的投入 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多