Java 使用可选参数更新查询
我试图用可选参数更新行,但下面的查询出错Java 使用可选参数更新查询,java,spring-boot,jpa,spring-data-jpa,Java,Spring Boot,Jpa,Spring Data Jpa,我试图用可选参数更新行,但下面的查询出错 @Modifying @Transactional @Query("UPDATE Visit visits SET " + " visits.approvalStatus is null OR visits.approvalStatus = :approvalStatus " + " , visits.declineReason is null OR visits.decl
@Modifying
@Transactional
@Query("UPDATE Visit visits SET "
+ " visits.approvalStatus is null OR visits.approvalStatus = :approvalStatus "
+ " , visits.declineReason is null OR visits.declineReason =:declineReason "
+ " WHERE visits.visitId in :visitIds ")
public int patchUpdate(@Param("approvalStatus") String approvalStatus,
@Param("declineReason") String declineReason, @Param("visitIds") List<Integer> visitIds);
编辑以添加信息:在这里,我想在新数据不为null时更新特定字段,否则该参数应被忽略
感谢您的帮助在
更新
查询中出现语法错误,用于设置字段值的部分丢失
可能使用COALESCE
函数的查询(或使用IsNull
,NullIf
,NVL
等函数的本机查询)会有所帮助:
@Query(“更新访问集”
+visits.approvalStatus=合并(:approvalStatus,approvalStatus)
+visions.declineReason=合并(:declineReason,declineReason)
+“WHERE visions.visitId in:visitIds”)
公共int补丁更新(
@参数(“approvalStatus”)字符串approvalStatus,
@参数(“declineReason”)字符串declineReason,
@参数(“visitIds”)列表visitIds
);
或使用类似的案例
语句
@Query(“更新访问集”
+“visits.approvalStatus=(大小写:approvalStatus当为空时,则approvalStatus其他:approvalStatus结束)”
+“visits.declineReason=(案例:declineReason当为空时,则declineReason其他:declineReason结束)”
+“WHERE visions.visitId in:visitIds”)
公共int补丁更新(
@参数(“approvalStatus”)字符串approvalStatus,
@参数(“declineReason”)字符串declineReason,
@参数(“visitIds”)列表visitIds
);
为空用于检查字段。
对于根据条件设置列,您可以使用:
UPDATE Visit visits SET "
+ " visits.approvalStatus = CASE "
+ " WHEN visits.visitId in :visitIds THEN :approvalStatus "
+ " ELSE NULL "
+ " END"
您可以在设置数据时添加案例条件,如
UPDATE
Visit visits
SET
visits.approvalStatus = (
case
when :approvalStatus is null
then visits.approvalStatus
else :approvalStatus
end
),
visits.declineReason = (
case
when :declineReason is null
then visits.declineReason
else :declineReason
end
),
WHERE visits.visitId in :visitIds
如果传递值为null,则设置db中的值,否则设置传递值。此查询的目的是什么?如果approvalStatus不为null,您是否试图更新它?是@Shawrup,我只在字段不为null时更新它,我在这个查询中添加了一些其他字段。我只在字段不为空时更新字段。你的意思是现有approvalStatus不为空还是新数据不为空?当新数据不为空时,可能会在
中添加和:approvalStatus不为空,否则,它应该被忽略。它不是准确的答案,但在找到解决方案时是最有帮助的(用例)。谢谢还有一个问题:如果我的可选参数为null怎么办。如何验证传入布尔参数值的null?我不太清楚您的意思。。对于输入参数,可以使用Boolean
包装而不是primitiveBoolean
。
UPDATE
Visit visits
SET
visits.approvalStatus = (
case
when :approvalStatus is null
then visits.approvalStatus
else :approvalStatus
end
),
visits.declineReason = (
case
when :declineReason is null
then visits.declineReason
else :declineReason
end
),
WHERE visits.visitId in :visitIds