1
0

feat: 增加query查询测试

This commit is contained in:
2025-08-14 20:22:45 +08:00
parent 84d9b63707
commit 50043157df
5 changed files with 126 additions and 23 deletions

View File

@@ -50,10 +50,10 @@ public class Query {
private Map<String, Object> notEqual;
private Map<String, String> like;
private Map<String, String> notLike;
private Map<String, Comparable<Object>> great;
private Map<String, Comparable<Object>> less;
private Map<String, Comparable<Object>> greatEqual;
private Map<String, Comparable<Object>> lessEqual;
private Map<String, Object> great;
private Map<String, Object> less;
private Map<String, Object> greatEqual;
private Map<String, Object> lessEqual;
private Map<String, List<Object>> in;
private Map<String, List<Object>> notIn;
private Map<String, Between> between;
@@ -123,35 +123,35 @@ public class Query {
this.notLike = notLike;
}
public Map<String, Comparable<Object>> getGreat() {
public Map<String, Object> getGreat() {
return great;
}
public void setGreat(Map<String, Comparable<Object>> great) {
public void setGreat(Map<String, Object> great) {
this.great = great;
}
public Map<String, Comparable<Object>> getLess() {
public Map<String, Object> getLess() {
return less;
}
public void setLess(Map<String, Comparable<Object>> less) {
public void setLess(Map<String, Object> less) {
this.less = less;
}
public Map<String, Comparable<Object>> getGreatEqual() {
public Map<String, Object> getGreatEqual() {
return greatEqual;
}
public void setGreatEqual(Map<String, Comparable<Object>> greatEqual) {
public void setGreatEqual(Map<String, Object> greatEqual) {
this.greatEqual = greatEqual;
}
public Map<String, Comparable<Object>> getLessEqual() {
public Map<String, Object> getLessEqual() {
return lessEqual;
}
public void setLessEqual(Map<String, Comparable<Object>> lessEqual) {
public void setLessEqual(Map<String, Object> lessEqual) {
this.lessEqual = lessEqual;
}

View File

@@ -37,7 +37,7 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
if (ObjectHelper.isNotNull(entity.getId())) {
var id = entity.getId();
var targetEntity = repository.findById(entity.getId()).orElseThrow(() -> new IdNotFoundException(id));
BeanUtils.copyProperties(entity, targetEntity, "id", "created_time", "modified_time");
BeanUtils.copyProperties(entity, targetEntity, "id", "createdTime", "modifiedTime");
entity = targetEntity;
}
entity = repository.save(entity);
@@ -107,6 +107,7 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
return value;
}
@SuppressWarnings("unchecked")
protected List<Predicate> queryPredicates(Query.Queryable queryable, Root<ENTITY> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
var predicates = new ArrayList<Predicate>();
if (ObjectHelper.isNull(queryable)) {
@@ -116,7 +117,7 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
queryable.getNullEqual().forEach(column -> predicates.add(builder.isNull(column(root, column))));
}
if (ObjectHelper.isNotEmpty(queryable.getNotNullEqual())) {
queryable.getNotNullEqual().forEach(column -> predicates.add(builder.isNull(column(root, column))));
queryable.getNotNullEqual().forEach(column -> predicates.add(builder.isNotNull(column(root, column))));
}
if (ObjectHelper.isNotEmpty(queryable.getEmpty())) {
queryable.getEmpty().forEach(column -> predicates.add(builder.isEmpty(column(root, column))));
@@ -143,16 +144,16 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
queryable.getNotLike().forEach((column, value) -> predicates.add(builder.notLike(column(root, column), value)));
}
if (ObjectHelper.isNotEmpty(queryable.getGreat())) {
queryable.getGreat().forEach((column, value) -> predicates.add(builder.greaterThan(column(root, column), value)));
queryable.getGreat().forEach((column, value) -> predicates.add(builder.greaterThan(column(root, column), (Comparable<Object>) value)));
}
if (ObjectHelper.isNotEmpty(queryable.getLess())) {
queryable.getLess().forEach((column, value) -> predicates.add(builder.lessThan(column(root, column), value)));
queryable.getLess().forEach((column, value) -> predicates.add(builder.lessThan(column(root, column), (Comparable<Object>) value)));
}
if (ObjectHelper.isNotEmpty(queryable.getGreatEqual())) {
queryable.getGreatEqual().forEach((column, value) -> predicates.add(builder.greaterThanOrEqualTo(column(root, column), value)));
queryable.getGreatEqual().forEach((column, value) -> predicates.add(builder.greaterThanOrEqualTo(column(root, column), (Comparable<Object>) value)));
}
if (ObjectHelper.isNotEmpty(queryable.getLessEqual())) {
queryable.getLessEqual().forEach((column, value) -> predicates.add(builder.lessThanOrEqualTo(column(root, column), value)));
queryable.getLessEqual().forEach((column, value) -> predicates.add(builder.lessThanOrEqualTo(column(root, column), (Comparable<Object>) value)));
}
if (ObjectHelper.isNotEmpty(queryable.getIn())) {
queryable.getIn().forEach((column, value) -> predicates.add(builder.in(column(root, column)).value(value)));
@@ -175,12 +176,12 @@ public abstract class SimpleServiceSupport<ENTITY extends SimpleEntity> implemen
@Override
public Page<ENTITY> list(Query listQuery) {
var pageRequest = PageRequest.of(DEFAULT_PAGE_INDEX - 1, DEFAULT_PAGE_SIZE, Sort.by("created_time").descending());
var pageRequest = PageRequest.of(DEFAULT_PAGE_INDEX - 1, DEFAULT_PAGE_SIZE, Sort.by("createdTime").descending());
if (ObjectHelper.isNotNull(listQuery.getPage())) {
pageRequest = PageRequest.of(
ObjectHelper.defaultIfNull(listQuery.getPage().getIndex(), DEFAULT_PAGE_INDEX) - 1,
ObjectHelper.defaultIfNull(listQuery.getPage().getSize(), DEFAULT_PAGE_SIZE),
Sort.by("create_time").descending()
Sort.by("createdTime").descending()
);
}
return repository.findAll(

View File

@@ -37,15 +37,63 @@ public class TestApplication {
@EventListener(ApplicationReadyEvent.class)
public void runTests() throws JsonProcessingException {
// 增
var cid1 = saveItem("company", "{\"name\": \"Apple\"}").get("data").asLong();
var cid2 = saveItem("company", "{\"name\": \"Banana\"}").get("data").asLong();
var cid3 = saveItem("company", "{\"name\": \"Cheery\"}").get("data").asLong();
var cid1 = saveItem("company", "{\"name\": \"Apple\",\"members\": 10}").get("data").asLong();
var cid2 = saveItem("company", "{\"name\": \"Banana\",\"members\": 20}").get("data").asLong();
var cid3 = saveItem("company", "{\"name\": \"Cheery\",\"members\": 20}").get("data").asLong();
// 查
var companies = listItems("company");
Assert.isTrue(companies.at("/data/items").size() == 3, "数量错误");
Assert.isTrue(companies.at("/data/total").asLong() == 3, "返回数量错误");
// language=JSON
var companies2 = listItems("company", "{\n" +
" \"page\": {\n" +
" \"index\": 1,\n" +
" \"size\": 2\n" +
" }\n" +
"}");
Assert.isTrue(companies2.at("/data/items").size() == 2, "数量错误");
Assert.isTrue(companies2.at("/data/total").asLong() == 3, "返回数量错误");
// language=JSON
var companies3 = listItems("company", "{\n" +
" \"query\": {\n" +
" \"notNullEqual\": [\n" +
" \"name\"\n" +
" ],\n" +
" \"equal\": {\n" +
" \"name\": \"Apple\"\n" +
" },\n" +
" \"like\": {\n" +
" \"name\": \"Appl%\"\n" +
" },\n" +
" \"less\": {\n" +
" \"members\": 50\n" +
" },\n" +
" \"greatEqual\": {\n" +
" \"members\": 0\n" +
" },\n" +
" \"in\": {\n" +
" \"name\": [\n" +
" \"Apple\",\n" +
" \"Banana\"\n" +
" ]\n" +
" },\n" +
" \"between\": {\n" +
" \"members\": {\n" +
" \"start\": 0,\n" +
" \"end\": 50\n" +
" }\n" +
" }\n" +
" },\n" +
" \"page\": {\n" +
" \"index\": 1,\n" +
" \"size\": 2\n" +
" }\n" +
"}");
Assert.isTrue(companies3.at("/data/items").size() == 1, "数量错误");
Assert.isTrue(companies3.at("/data/total").asLong() == 1, "返回数量错误");
var company1 = detailItem("company", cid1);
Assert.isTrue(cid1 == company1.at("/data/id").asLong(), "id错误");
Assert.isTrue("Apple".equals(company1.at("/data/name").asText()), "name错误");
@@ -91,6 +139,17 @@ public class TestApplication {
return MAPPER.readTree(response.getBody());
}
private JsonNode listItems(String path, String query) throws JsonProcessingException {
var response = REST_CLIENT.postForEntity(
"%s/%s/list".formatted(BASE_URL, path),
new HttpEntity<>(query, headers()),
String.class
);
Assert.isTrue(response.getStatusCode().is2xxSuccessful(), "请求失败");
Assert.notNull(response.getBody(), "请求失败");
return MAPPER.readTree(response.getBody());
}
private JsonNode detailItem(String path, Long id) throws JsonProcessingException {
var response = REST_CLIENT.getForEntity(
"%s/%s/detail/%d".formatted(BASE_URL, path, id),

View File

@@ -23,6 +23,7 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
var company = new Company();
company.setId(item.getId());
company.setName(item.getName());
company.setMembers(item.getMembers());
return company;
};
}
@@ -33,6 +34,7 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
var item = new ListItem();
item.setId(company.getId());
item.setName(company.getName());
item.setMembers(company.getMembers());
return item;
};
}
@@ -43,6 +45,7 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
var item = new DetailItem();
item.setId(company.getId());
item.setName(company.getName());
item.setMembers(company.getMembers());
item.setCreatedTime(company.getCreatedTime());
item.setModifiedTime(company.getModifiedTime());
return item;
@@ -52,6 +55,7 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
public static class SaveItem {
private Long id;
private String name;
private Integer members;
public Long getId() {
return id;
@@ -69,11 +73,20 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
this.name = name;
}
public Integer getMembers() {
return members;
}
public void setMembers(Integer members) {
this.members = members;
}
@Override
public String toString() {
return "SaveItem{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
'}';
}
}
@@ -81,6 +94,7 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
public static class ListItem {
private Long id;
private String name;
private Integer members;
public Long getId() {
return id;
@@ -98,11 +112,20 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
this.name = name;
}
public Integer getMembers() {
return members;
}
public void setMembers(Integer members) {
this.members = members;
}
@Override
public String toString() {
return "ListItem{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
'}';
}
}
@@ -110,6 +133,7 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
public static class DetailItem {
private Long id;
private String name;
private Integer members;
private LocalDateTime createdTime;
private LocalDateTime modifiedTime;
@@ -129,6 +153,14 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
this.name = name;
}
public Integer getMembers() {
return members;
}
public void setMembers(Integer members) {
this.members = members;
}
public LocalDateTime getCreatedTime() {
return createdTime;
}
@@ -150,6 +182,7 @@ public class CompanyController extends SimpleControllerSupport<Company, CompanyC
return "DetailItem{" +
"id=" + id +
", name='" + name + '\'' +
", members=" + members +
", createdTime=" + createdTime +
", modifiedTime=" + modifiedTime +
'}';

View File

@@ -13,6 +13,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Comment("企业")
public class Company extends SimpleEntity {
private String name;
private Integer members;
public String getName() {
return name;
@@ -22,10 +23,19 @@ public class Company extends SimpleEntity {
this.name = name;
}
public Integer getMembers() {
return members;
}
public void setMembers(Integer members) {
this.members = members;
}
@Override
public String toString() {
return "Company{" +
"name='" + name + '\'' +
", members=" + members +
"} " + super.toString();
}
}