使用Hibernate + JPA + Spring Web处理SQL自定义类型作为JSON响应 &



我有一个实体类,在其他字段中有一个自定义类型字段

@Entity
@Table(name = "something") 
public class Test {
@Id
private Integer id;
private <SomethingHere> customTypeObject;
// Other fields, getters, and setters not shown
}

使用这个类,我使用repository.findAll()生成数据的json表示

@Controller 
public class TestController {
@AutoWired
private TestRepository repo
@GetMapping("/test")
private List<Test> test() {
return repo.findAll();
}
}

对用户的JSON响应旨在以JSON格式显示自定义类型中的字段。如果我将customTypeObject标记为String,则响应如下所示[{id: 1, customTypeObject: "(1,2)"}]而我更喜欢这样的回答[{id: 1, customTypeObject: { A: 1, B: 2 }}]

我意识到我可以通过为自定义类型创建另一个实体类来实现这一点,我手动输入字段,但我计划在开发过程中经常增加自定义类型中的字段数量,因此我更希望程序能够为我跟踪字段。

有什么办法可以做到吗?

如果我将customTypeObject标记为String,则响应如下[{id: 1, customTypeObject: "(1,2)"}]

根据您的示例,我假设您正在存储一个JSON字符串。您可以创建DTO类并使用mapstruct定义从实体到DTO的映射器。您可以使用fasterxml将字符串解析为对象
// entity class
@Entity
@Table(name = "something") 
public class Test {
@Id
private Integer id;
private String customTypeObject;
// Other fields, getters, and setters not shown
}
// DTO class
public class TestDTO {
// same fields as Entity 
private Map<String,Object> customTypeObject;
// or private Object customTypeObject;
}
// mapper class
@Mapper
public interface TestMapper {
TestMapper INSTANCE =  Mappers.getMapper(TestMapper.class);
ObjectMapper objectMapper = new ObjectMapper();
@Mappings({
@Mapping(source = "test.customTypeObject", target = "customTypeObject", qualifiedByName = "parseCustomObject")
})
TestDTO entityToDto(Test test)

List<TestDTO> entitiesToDto(List<Test> tests) 
// the return type of this method must be the same as the datatype for the field in the dto class
@Named("parseCustomObject")
static Map<String,Object> getCustomObject(String objStr) throws JsonProcessingException {
Map<String, Object> objectMap = new HashMap<>();
if (Objects.nonNull(objStr)) {
objectMap = objectMapper.readValue(objStr, Map.class);
}
return objectMap;
}
}
// controller or service class
@Controller 
public class TestController {
@AutoWired
private TestRepository repo
@GetMapping("/test")
private List<TestDTO> test() {
List<Test> t = repo.findAll();
return TestMapper.INSTANCE.entitiesToDto(t);
}
}

您也可以使用GSON (com.google.code.gson)或JSONObject (org.json.JSONObject)手动创建JSON主体,这样您就可以根据需要操作它这里是一个链接到一篇文章,应该是有帮助的

https://www.baeldung.com/java-org-json
  • https://www.baeldung.com/jackson-vs-gson

由于您正在使用Spring,并且Spring使用Jackson ObjectMapper,您可以为您的customTypeObject创建另一个类,其中包含您想要显示的字段的相应getter方法(可能最好使用Lombok的@Getter,这样您就不需要编写getter),如果您有getter方法,Jackson将自动为您创建json。

如果您使用JPA与Hibernate,我建议使用Hibernate类型将JSON列映射到POJO, Map,甚至JsonNode。

下面是一个解释如何使用它的例子

如果您想在数据库中保存一个Custom对象,那么您可以创建自己的Hibernate转换器

<<ul>
  • 自定义类型/gh>
  • JPA转换器供参考,但可能超出范围
  • 你也可以尝试更新自定义对象类的toString()方法。

    从你的问题,它是不清楚你想要所需的表示,它是在数据库或在UI字段?

    最新更新