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
包装而不是primitive
Boolean
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