Java 从hibernate更新并返回列表(使用sql查询)
我有一个更新(表1)和插入(表2)的查询,并在末尾返回一个由查询更新的ID列表 当我从sql运行它时,它运行正常。 但是当我从代码运行时,它返回受影响的id,但不更新行 这是因为我是按以下方式执行的: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
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);
}
}
});
}