Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JPA实体格式化为带有数据库列的JSON?_Java_Jpa - Fatal编程技术网

Java 如何将JPA实体格式化为带有数据库列的JSON?

Java 如何将JPA实体格式化为带有数据库列的JSON?,java,jpa,Java,Jpa,将JPA实体转换为不包含相关对象但包含数据库列的JSON的最佳方式是什么 考虑: public class Question implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) private Integer id; @Basic(optional = false) @NotNull

将JPA实体转换为不包含相关对象但包含数据库列的JSON的最佳方式是什么

考虑:

public class Question implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    private Integer id;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "question_title")
    private String questionTitle;

    @Size(max = 500)
    @Column(name = "question_desc")
    private String questionDesc;

    @JoinColumn(name = "requires_question_id", referencedColumnName = "id")
    @ManyToOne
    private Question requiredQuestion;

    ...
}
将问题直接转换为json可能如下所示:

{
    "id": 1,
    "questionTitle": "Q1",
    "questionDesc": "A Question 123"
    "requiredQuestion": {
        "id": 2, 
        "questionTitle": "Q2",
        "questionDesc": "A Question 456"
     } 
}
{
    "id": 1,
    "question_title": "Q1",
    "question_desc": "A Question 123"
    "required_question_id": 2
}
然而,更理想的结果可能如下所示:

{
    "id": 1,
    "questionTitle": "Q1",
    "questionDesc": "A Question 123"
    "requiredQuestion": {
        "id": 2, 
        "questionTitle": "Q2",
        "questionDesc": "A Question 456"
     } 
}
{
    "id": 1,
    "question_title": "Q1",
    "question_desc": "A Question 123"
    "required_question_id": 2
}
获得理想结果的最佳方法是什么

创建一个带有字符串键(如“question_title”)的hashmap,并手动分配对象属性,然后将该映射转换为json?

您可以像任何其他POJO一样将实体序列化为json。要完全控制输出格式,请编写一个for
问题
类。它看起来像这样

public class QuestionSerializer extends JsonSerializer<Question> {
    @Override
    public void serialize(Question value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        jgen.writeNumberField("id", value.getId());
        jgen.writeStringField("question_title", value.getQuestionTitle());
        jgen.writeStringField("question_desc", value.getQuestionDesc());
        jgen.writeNumberField("required_question_id", value.getRequiredQuestion().getId());
        jgen.writeEndObject();
    }
}
公共类问题序列化程序扩展JsonSerializer{
@凌驾
公共void序列化(问题值、JsonGenerator jgen、SerializerProvider提供程序)
抛出IOException、JsonProcessingException{
jgen.writeStartObject();
jgen.writeNumberField(“id”,value.getId());
jgen.writeStringField(“问题标题”,value.getQuestionTitle());
writeStringField(“question_desc”,value.getQuestionDesc());
jgen.writeNumberField(“必需的问题id”,value.getRequiredQuestion().getId());
jgen.writeEndObject();
}
}

手动为对象指定值不是一个好主意,因为您可以通过在hibernate中进行投影获得理想的结果,然后将映射转换为json

return sessionFactory.getCurrentSession()
.createCriteria(Question.class)
.createAlias("requiredQuestion","requiredQuestion")
.setProjection(Projections.projectionList()
    .add(Projections.property("id").as("id"))
    .add(Projections.property("questionTitle").as("questionTitle"))
    .add(Projections.property("questionDesc").as("questionDesc"))
    .add(Projections.property("requiredQuestion.id").as("requiredQuestionid")))
    .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
.list();

这是获得预期结果的代码,您可以将其转换为json。

在这种类型的应用程序中,您不应该使用同一个对象与客户机通信并在数据库中持久化数据。原因是您的表结构可能因需求或其他原因而更改,您必须更改JPA实体。您还必须更改客户端的代码,因为JPA实体类更改了其结构


您应该创建一个简单的POJO,用于向客户机传输信息(序列化)和从客户机获取信息(反序列化)。并使用类似Jackson或gson的库将Java对象转换为Json格式和相反格式。

当requiredQuestion为空时,有什么建议吗?写入字符串字段时不能调用getId。只需在它前面加上if(value.getRequiredQuestion()!=null)?是的,您必须检查null requiredQuestion,但是根据您在这种情况下想要输出的内容(根本没有
必需的问题id
字段,或者null作为值),您可以在
else
分支中使用
jgen.writeNullField(“必需的问题id”)