我有两个实体:调查和信息。
调查实体:
@RooJavaBean
@RooToString
@RooJpaActiveRecord(table = "information")
@JsonPropertyOrder({ "seq"})
public class Information {
@NotNull
private String title;
@ManyToOne(fetch = FetchType.LAZY)
@JsonBackReference
private Survey survey;
private int seq;
}
信息实体:
@RooJavaBean
@RooToString
@RooJpaActiveRecord(table = "survey")
public class Survey {
@NotNull
@Size(min = 3, max = 50)
private String title;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="survey")
@JsonManagedReference
private Set<Information> informations = new HashSet<Information>();
}
我使用 jackson 进行序列化。
我的期望:
{
"survey" : {
"title" : "Medical Survey",
"informations" : [ {
"id" : 1,
"seq" : 0,
"title" : "Name:",
"version" : 0
}, {
"id" : 2,
"seq" : 1,
"title" : "Age:",
"version" : 0
}, {
"id" : 3,
"seq" : 2,
"title" : "test",
"version" : 0
}, {
"id" : 4,
"seq" : 3,
"title" : "test",
"version" : 0
} ],
"id" : 1,
"version" : 134
}
}
但结果是:
{
"survey" : {
"title" : "Medical Survey",
"informations" : [ {
"id" : 2,
"seq" : 1,
"title" : "Age:",
"version" : 0
}, {
"id" : 4,
"seq" : 3,
"title" : "test",
"version" : 0
}, {
"id" : 3,
"seq" : 2,
"title" : "test",
"version" : 0
}, {
"id" : 1,
"seq" : 0,
"title" : "Name:",
"version" : 0
} ],
"id" : 1,
"version" : 134
}
}
- 我知道在这种情况下使用列表应该更合适,但 Spring Roo 不支持脚手架中的列表。因此,我使用了带有 seq 号的 HashSet。
- 我还知道我可以创建一个信息数组列表为@transient,然后克隆 并在业务层进行排序。
但是我想知道是否有更干净的解决方案,即序列化时排序。谢谢。
最佳答案
HashSet 无法排序,这只是正常的 java 行为。您正在寻找的是 TreeSet。为其提供一个 Comparator,或者在您的信息类中实现 Comparable,您的 Json 将会被排序。
关于jackson - 如何在 Jackson 中订购哈希集? @JsonPropertyOrder 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15659167/