From 50043157dfb219d08cc2b88958313c427c965b2c Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Thu, 14 Aug 2025 20:22:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0query=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/template/controller/Query.java | 24 +++---- .../service/SimpleServiceSupport.java | 17 ++--- .../service/template/TestApplication.java | 65 ++++++++++++++++++- .../controller/CompanyController.java | 33 ++++++++++ .../service/template/entity/Company.java | 10 +++ 5 files changed, 126 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/controller/Query.java b/src/main/java/com/lanyuanxiaoyao/service/template/controller/Query.java index 152a540..d9af1df 100644 --- a/src/main/java/com/lanyuanxiaoyao/service/template/controller/Query.java +++ b/src/main/java/com/lanyuanxiaoyao/service/template/controller/Query.java @@ -50,10 +50,10 @@ public class Query { private Map notEqual; private Map like; private Map notLike; - private Map> great; - private Map> less; - private Map> greatEqual; - private Map> lessEqual; + private Map great; + private Map less; + private Map greatEqual; + private Map lessEqual; private Map> in; private Map> notIn; private Map between; @@ -123,35 +123,35 @@ public class Query { this.notLike = notLike; } - public Map> getGreat() { + public Map getGreat() { return great; } - public void setGreat(Map> great) { + public void setGreat(Map great) { this.great = great; } - public Map> getLess() { + public Map getLess() { return less; } - public void setLess(Map> less) { + public void setLess(Map less) { this.less = less; } - public Map> getGreatEqual() { + public Map getGreatEqual() { return greatEqual; } - public void setGreatEqual(Map> greatEqual) { + public void setGreatEqual(Map greatEqual) { this.greatEqual = greatEqual; } - public Map> getLessEqual() { + public Map getLessEqual() { return lessEqual; } - public void setLessEqual(Map> lessEqual) { + public void setLessEqual(Map lessEqual) { this.lessEqual = lessEqual; } diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java b/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java index ac303a3..841f732 100644 --- a/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java +++ b/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java @@ -37,7 +37,7 @@ public abstract class SimpleServiceSupport 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 implemen return value; } + @SuppressWarnings("unchecked") protected List queryPredicates(Query.Queryable queryable, Root root, CriteriaQuery query, CriteriaBuilder builder) { var predicates = new ArrayList(); if (ObjectHelper.isNull(queryable)) { @@ -116,7 +117,7 @@ public abstract class SimpleServiceSupport 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 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) 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) 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) 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) 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 implemen @Override public Page 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( diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java index 301a806..5ed1d7b 100644 --- a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java +++ b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java @@ -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), diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java b/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java index c92ec0a..bbe156e 100644 --- a/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java +++ b/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java @@ -23,6 +23,7 @@ public class CompanyController extends SimpleControllerSupport