Spring Data JPA,带枚举属性的查询类

u1ehiz5o  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(130)
public class RedeemCodeQuery {
private String code;
private RedeemCode.CodeStatus status;
private String exportStatus;
public static enum CodeStatus {
    INIT,USED
}

public static enum ExportStatus {
    DEFAULT,EXPORTED
}
//getter setter...
}

 String sqlByQuery = """
         select rc from RedeemCode rc 
        where (:#{#query.code} is null or rc.code = :#{#query.code} )
        and ( :status is null or rc.status = :status )
        and ( :#{#query.exportStatus} is null or rc.exportStatus = :#{#query.exportStatus} )
        """;
@Query(sqlByQuery)
Page<RedeemCode> pageBy(@Param("query") RedeemCodeQuery query, @Param("status") CodeStatus status, Pageable pageable);

{#query.code}:工作时,代码类型为String,位于RedeemCodeQuery类内部;

rc.status =:status:工作,状态是枚举类型。
rc.exportStatus =:#{#query.exportStatus}:错误,exportStatus是枚举类型,并且在RedeemCodeQuery类中。
Spring SpEL可能会将:#{#query.exportStatus}更改为其他类型。可以将枚举放在类中作为查询参数吗?如何做到这一点?

lokaqttq

lokaqttq1#

这里有两个选项:
1.或者使用Enum.name()获取rc.exportStatus字段的String表示,以与Stringrc.exportStatus参数进行比较:

String sqlByQuery = """
         select rc from RedeemCode rc 
        where (:#{#query.code} is null or rc.code = :#{#query.code} )
        and ( :status is null or rc.status = :status )
        and ( :#{#query.exportStatus} is null or rc.exportStatus.name() = :#{#query.exportStatus} )
        """;
@Query(sqlByQuery)
Page<RedeemCode> pageBy(@Param("query") RedeemCodeQuery query, @Param("status") CodeStatus status, Pageable pageable);

1.或者使用特殊的T()operatorEnum.valueOf()Stringrc.exportStatus字段转换为ExportStatus枚举的成员:

String sqlByQuery = """
         select rc from RedeemCode rc 
        where (:#{#query.code} is null or rc.code = :#{#query.code} )
        and ( :status is null or rc.status = :status )
        and ( :#{#query.exportStatus} is null or rc.exportStatus = :#{T(full.path.to.ExportStatus).valueOf(#query.exportStatus)})
        """;
@Query(sqlByQuery)
Page<RedeemCode> pageBy(@Param("query") RedeemCodeQuery query, @Param("status") CodeStatus status, Pageable pageable);

1.或者使用肮脏的黑客:SpEL表达式#query.exportStatus假设exportStatus字段有一个getter,所以你可以修改它以返回ExportStatus而不是String,保持你的初始查询:

public class RedeemCodeQuery {
private String code;
private RedeemCode.CodeStatus status;
private String exportStatus;

public static enum ExportStatus {
    DEFAULT,EXPORTED
}

public ExportStatus getExportStatus() {
  return ExportStatus.valueOf(exportStatus);
}

这将在运行时为您提供给予理想的类型。

相关问题