【发布时间】:2022-02-01 10:15:31
【问题描述】:
假设我有以下 JPA 实体,枚举字段 ON/OFF 映射到 SQL 枚举(“on”,“off”)。
@Entity
public class Process {
@Id
private Long Id;
@Convert(converter = StatusConverter.class)
private Status status;
// getter/setter omitted
}
public enum Status {
ON("on"),
OFF("off");
private final String status;
Status(String status) {
this.status = status;
}
// JSON (de)serialization
@JsonCreator
public static Status decode(String status) {
return valueOf(status.toUpperCase());
}
@JsonValue
public getStatus() {
return status;
}
// DAO layer conversion
public String toDatabaseColumn() {
return this.name().toLowerCase();
}
}
@Converter
public class StatusConverter implements AttributeConverter<Status, String> {
@Override
public String convertToDatabaseColumn(Status attribute) {
return attribute.toDatabaseColumn();
}
@Override
public Status convertToEntityAttribute(String dbData) {
return Status.decode(dbData);
}
}
// Spring JPA projection
public interface ProcessSummary {
String getStatus();
}
// a minimalist JPA repository
public interface ProcessRepository extends Repository<Process, Long> {
<T> T findById(Long id, Class<T> type;
}
如果我在 REST 控制器中使用 repository.findById(1L, Process.class),DAO 层转换和 JSON 序列化都按预期工作:
- 我的数据库记录的状态设置为
on - 映射到Java
Status.ON - 实体被序列化为
{
"status" : "on"
}
但如果我改用repository.findById(1L, ProcessSummary.class),实体会被序列化为
{
"status" : "ON"
}
使用投影作为目标类型时,如何获得相同的结果?是否可以使用投影,或者我应该尝试其他方法(可能是 DTO 类)?
【问题讨论】:
标签: spring jackson spring-data