我有一个访问数据库的应用程序,必须根据输入按不同的字段排序结果.
这是我的排序功能:
IQueryable<Entity> GetSortedData(IQueryable<Entity> result, String orderby, bool desc)
{
switch (orderby.ToLower())
{
case "id":
result = result.OrderBy(c => c.Id);
break;
case "code":
result = result.OrderBy(c => c.Code);
break;
case "active":
result = result.OrderBy(c => c.Active);
break;
default:
result = result.OrderBy(c => c.Name);
break;
}
if (pageData.SortDesc)
{
var res = result.ToList();
res.Reverse();
return res.AsQueryable();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这段代码存在一些我不喜欢的问题:
重复的代码太多了.如果它是"纯粹的SQL
"查询,它看起来像
SELECT*FROM data_table ORDER BY CASE @OrderBy WHEN'id'Then id when'code'THEN code WHEN'active'THEN
active ELSE name
END;
转换为列表并返回以进行反转.我不能改变返回值类型,我绝对不想写更无用的代码(基本上是翻倍switch …
我的问题很小:
相比 fastrxml.jackson,我更喜欢 Gson。我希望在 Gson 中看到的一个可能的功能是:
//some code
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private Date endDate;
//some code
Run Code Online (Sandbox Code Playgroud)
我发现在 Gson 中做同样事情的唯一方法是:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();
Run Code Online (Sandbox Code Playgroud)
我认为注释比上面的初始化更容易理解。有什么方法可以注释或创建一些属性以便代码
gson.fromJson("\"{\\\"Id\\\": 703,\\\"StartDate\\\": \\\"2019-10-01T00:00:00\\\"," +
" \\\"EndDate\\\": \\\"2019-10-25T00:00:00\\\",\\\"Title\\\": \\\"exmample title\\\"}\"",
MyObj.class)
Run Code Online (Sandbox Code Playgroud)
将生成 MyObj 类的对象:
public class MyObj{
@SerializedName("Id")
private Long id;
@SerializedName("StartDate")
//analogue of JsonFormat????
private Date startDate;
@SerializedName("EndDate")
//analogue of JsonFormat????
private Date endDate;
@SerializedName("Title")
private String title;
}
Run Code Online (Sandbox Code Playgroud) 我偶然发现了一个有趣的案例,但我不知道如何解决它。这可能与布尔字段的 JSON Post 请求默认发送 false有关,但该文章的建议没有帮助。
假设我有这门课:
public class ReqBody {
@NotNull
@Pattern(regexp = "^[0-9]{10}$")
private String phone;
//other fields
@NotNull
@JsonProperty(value = "create_anonymous_account")
private Boolean createAnonymousAccount = null;
//constructors, getters and setters
public Boolean getCreateAnonymousAccount() {
return createAnonymousAccount;
}
public void setCreateAnonymousAccount(Boolean createAnonymousAccount) {
this.createAnonymousAccount = createAnonymousAccount;
}
}
Run Code Online (Sandbox Code Playgroud)
我也有端点:
@PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<MyOutput> test(
@ApiParam(value = "information", required = true) @RequestBody ReqBody input
) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
问题是当我将请求正文发送为:
{
"phone": "0000000006",
"create_anonymous_account": …
Run Code Online (Sandbox Code Playgroud)