From 99877eddcc0ce8ee9fb6f2560658d8d7c81da4e8 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 30 Sep 2024 22:55:02 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A1.7=20=E9=87=8D=E6=9E=84=20service?= =?UTF-8?q?=20query=20=E7=9A=84=E7=BB=84=E7=BB=87=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 27 +++++----- .../gaea/app/controller/DomainApplication.kt | 5 +- .../gaea/app/controller/RecordApplication.kt | 3 +- .../gaea/app/controller/query/IQueryApp.kt | 10 ++-- .../gaea/app/controller/query/QueryApp.kt | 3 +- .../java/com/synebula/gaea/jpa/JpaQuery.kt | 49 ++++++++++++------- .../synebula/gaea/jpa/JpaRepositoryFactory.kt | 17 +++++++ .../method/resolver/PageMethodResolver.kt | 2 +- .../mongodb/autoconfig/MongoDbContextProxy.kt | 2 +- .../db/{context => }/MongodbContext.kt | 2 +- .../mongodb/db/{query => }/MongodbQuery.kt | 25 +++++----- .../mongodb/db/query/MongodbQueryFactory.kt | 23 --------- src/gaea.spring/build.gradle | 9 ---- .../com/synebula/gaea/db/query/IQuery.kt | 19 +++---- .../synebula/gaea/db/query/IQueryFactory.kt | 17 ------- .../kotlin/com/synebula/gaea/db/query/Page.kt | 8 +-- .../synebula/gaea/domain/service/Service.kt | 3 +- 17 files changed, 108 insertions(+), 116 deletions(-) create mode 100644 src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/JpaRepositoryFactory.kt rename src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/{context => }/MongodbContext.kt (97%) rename src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/{query => }/MongodbQuery.kt (75%) delete mode 100644 src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/query/MongodbQueryFactory.kt delete mode 100644 src/gaea/src/main/kotlin/com/synebula/gaea/db/query/IQueryFactory.kt diff --git a/build.gradle b/build.gradle index 15bd269..17c840b 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ buildscript { subprojects { group 'com.synebula' - version '1.6.0' + version '1.7.0' buildscript { repositories { @@ -66,16 +66,21 @@ subprojects { } publishing { -// repositories { -// maven { -// allowInsecureProtocol = true -// url = "$nexus_url" -// credentials { -// username = "$nexus_usr" -// password = "$nexus_pwd" -// } -// } -// } + repositories { + maven { + name = "Gitea" + url = uri("https://git.synebula.com/api/packages/alex/maven") + + credentials(HttpHeaderCredentials) { + name = "Authorization" + value = "token 1b9a13c1c75832c2f82beba8c8db340364eff7b1" + } + + authentication { + header(HttpHeaderAuthentication) + } + } + } publications { mavenJava(MavenPublication) { diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/DomainApplication.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/DomainApplication.kt index cfe50fe..42b9c73 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/DomainApplication.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/DomainApplication.kt @@ -20,8 +20,9 @@ import org.springframework.beans.factory.annotation.Autowired open class DomainApplication( override var name: String, override var service: IService, - override var query: IQuery, - override var logger: ILogger, + override var query: IQuery, + override var clazz: Class, + override var logger: ILogger ) : ICommandApp, IQueryApp { @Autowired diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/RecordApplication.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/RecordApplication.kt index 2d5de7a..1ba178b 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/RecordApplication.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/RecordApplication.kt @@ -20,7 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired open class RecordApplication, ID>( override var name: String, override var service: IService, - override var query: IQuery, + override var query: IQuery, + override var clazz: Class, override var logger: ILogger, ) : ISimpleCommandApp, IQueryApp { diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/query/IQueryApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/query/IQueryApp.kt index d625cda..dbb58ef 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/query/IQueryApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/query/IQueryApp.kt @@ -13,12 +13,14 @@ interface IQueryApp : IApplication { /** * 查询服务 */ - var query: IQuery + var query: IQuery + + var clazz: Class @Method("获取数据") @GetMapping("/{id:.+}") fun get(@PathVariable id: ID): HttpMessage { - val data = this.query.get(id) + val data = this.query.get(id, clazz) val msg = this.httpMessageFactory.create() msg.data = data return msg @@ -27,7 +29,7 @@ interface IQueryApp : IApplication { @Method("获取列表数据") @GetMapping fun list(@RequestParam params: LinkedHashMap): HttpMessage { - val data = this.query.list(params) + val data = this.query.list(params, clazz) return this.httpMessageFactory.create(data) } @@ -39,7 +41,7 @@ interface IQueryApp : IApplication { @RequestParam parameters: LinkedHashMap ): HttpMessage { val params = Params(page, size, parameters) - val data = this.query.paging(params) + val data = this.query.paging(params, clazz) return this.httpMessageFactory.create(data) } } \ No newline at end of file diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/query/QueryApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/query/QueryApp.kt index 9e6ad7a..e0a01f5 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/query/QueryApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/controller/query/QueryApp.kt @@ -14,7 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired */ open class QueryApp( override var name: String, - override var query: IQuery, + override var query: IQuery, + override var clazz: Class, override var logger: ILogger, ) : IQueryApp { diff --git a/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/JpaQuery.kt b/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/JpaQuery.kt index 42944ae..06be9f3 100644 --- a/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/JpaQuery.kt +++ b/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/JpaQuery.kt @@ -3,18 +3,20 @@ package com.synebula.gaea.jpa import com.synebula.gaea.db.query.IQuery import com.synebula.gaea.db.query.Page import com.synebula.gaea.db.query.Params +import com.synebula.gaea.jpa.proxy.method.resolver.PageMethodResolver import jakarta.persistence.EntityManager +import org.springframework.data.domain.Pageable +import org.springframework.data.jpa.domain.Specification import org.springframework.data.jpa.repository.support.SimpleJpaRepository -class JpaQuery(override var clazz: Class, entityManager: EntityManager) : IQuery { - protected var repo: SimpleJpaRepository +@Suppress("UNCHECKED_CAST") +class JpaQuery(protected var entityManager: EntityManager) : IQuery { + protected var repos = mutableMapOf, SimpleJpaRepository<*, *>>() - init { - repo = SimpleJpaRepository(clazz, entityManager) - } - override operator fun get(id: ID): TView? { - val view = this.repo.findById(id!!) + override operator fun get(id: ID, clazz: Class): TView? { + val repo = this.getJpaRepository(clazz) + val view = repo.findById(id!!) return if (view.isPresent) view.get() else null } @@ -25,9 +27,10 @@ class JpaQuery(override var clazz: Class, entityManager: Entit * @param params 查询条件。 * @return 视图列表 */ - override fun list(params: Map?): List { - // method proxy in JpaRepositoryProxy [SimpleJpaRepository] - return emptyList() + override fun list(params: Map?, clazz: Class): List { + val repo = this.getJpaRepository(clazz) + val spec = params?.toSpecification(clazz) as Specification + return repo.findAll(spec) } /** @@ -36,9 +39,10 @@ class JpaQuery(override var clazz: Class, entityManager: Entit * @param params 查询条件。 * @return 数量 */ - override fun count(params: Map?): Int { - // method proxy in JpaRepositoryProxy [SimpleJpaRepository] - return -1 + override fun count(params: Map?, clazz: Class): Long { + val repo = this.getJpaRepository(clazz) + val spec = params?.toSpecification(clazz) as Specification + return repo.count(spec) } /** @@ -47,9 +51,11 @@ class JpaQuery(override var clazz: Class, entityManager: Entit * @param params 分页条件 * @return 分页数据 */ - override fun paging(params: Params): Page { - // method proxy in JpaRepositoryProxy [SimpleJpaRepository] - return Page() + override fun paging(params: Params, clazz: Class): Page { + val repo = this.getJpaRepository(clazz) + val p = PageMethodResolver("findAll", clazz).mappingArguments(arrayOf(params)) + val page = repo.findAll(p[0] as Specification, p[1] as Pageable) + return Page(page.number + 1, page.size, page.totalElements, page.content) } /** @@ -59,9 +65,18 @@ class JpaQuery(override var clazz: Class, entityManager: Entit * * @return 视图列表 */ - override fun range(field: String, params: List): List { + override fun range(field: String, params: List, clazz: Class): List { // method proxy in JpaRepositoryProxy [SimpleJpaRepository] return emptyList() } + private fun getJpaRepository(clazz: Class): SimpleJpaRepository { + if (this.repos.isNotEmpty() && this.repos.containsKey(clazz)) { + return this.repos[clazz] as SimpleJpaRepository + } else { + val r = SimpleJpaRepository(clazz, entityManager) + this.repos[clazz] = r + return r + } + } } \ No newline at end of file diff --git a/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/JpaRepositoryFactory.kt b/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/JpaRepositoryFactory.kt new file mode 100644 index 0000000..2a880f3 --- /dev/null +++ b/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/JpaRepositoryFactory.kt @@ -0,0 +1,17 @@ +package com.synebula.gaea.jpa + +import com.synebula.gaea.domain.model.IAggregateRoot +import com.synebula.gaea.domain.repository.IRepository +import com.synebula.gaea.domain.repository.IRepositoryFactory +import jakarta.persistence.EntityManager + +class JpaRepositoryFactory(private var entityManager: EntityManager) : IRepositoryFactory { + override fun createRawRepository(clazz: Class<*>): IRepository<*, *> { + val constructor = JpaRepository::class.java.getConstructor(Class::class.java, EntityManager::class.java) + return constructor.newInstance(clazz, this.entityManager) + } + + override fun , I> createRepository(clazz: Class): IRepository { + return JpaRepository(clazz, this.entityManager) + } +} \ No newline at end of file diff --git a/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/proxy/method/resolver/PageMethodResolver.kt b/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/proxy/method/resolver/PageMethodResolver.kt index 36c68d3..100acf3 100644 --- a/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/proxy/method/resolver/PageMethodResolver.kt +++ b/src/gaea.jpa/src/main/java/com/synebula/gaea/jpa/proxy/method/resolver/PageMethodResolver.kt @@ -51,6 +51,6 @@ class PageMethodResolver(targetMethodName: String, clazz: Class<*>) : AbstractMe val page = result as Page<*> // Page 页面从0开始 [com.synebula.gaea.query.Page as QueryPage] - return QueryPage(page.number + 1, page.size, page.totalElements.toInt(), page.content) + return QueryPage(page.number + 1, page.size, page.totalElements, page.content) } } \ No newline at end of file diff --git a/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/autoconfig/MongoDbContextProxy.kt b/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/autoconfig/MongoDbContextProxy.kt index b68b605..b87934c 100644 --- a/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/autoconfig/MongoDbContextProxy.kt +++ b/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/autoconfig/MongoDbContextProxy.kt @@ -2,7 +2,7 @@ package com.synebula.gaea.mongodb.autoconfig import com.synebula.gaea.db.context.IDbContext import com.synebula.gaea.domain.repository.IRepository -import com.synebula.gaea.mongodb.db.query.MongodbQuery +import com.synebula.gaea.mongodb.db.MongodbQuery import com.synebula.gaea.mongodb.repository.MongodbRepository import com.synebula.gaea.db.query.IQuery import com.synebula.gaea.reflect.getGenericInterface diff --git a/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/context/MongodbContext.kt b/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/MongodbContext.kt similarity index 97% rename from src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/context/MongodbContext.kt rename to src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/MongodbContext.kt index 625e473..2513acd 100644 --- a/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/context/MongodbContext.kt +++ b/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/MongodbContext.kt @@ -1,4 +1,4 @@ -package com.synebula.gaea.mongodb.db.context +package com.synebula.gaea.mongodb.db import com.synebula.gaea.db.IEntity import com.synebula.gaea.db.context.IDbContext diff --git a/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/query/MongodbQuery.kt b/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/MongodbQuery.kt similarity index 75% rename from src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/query/MongodbQuery.kt rename to src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/MongodbQuery.kt index 8276ed7..ee7196f 100644 --- a/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/query/MongodbQuery.kt +++ b/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/MongodbQuery.kt @@ -1,4 +1,4 @@ -package com.synebula.gaea.mongodb.db.query +package com.synebula.gaea.mongodb.db import com.synebula.gaea.ext.firstCharLowerCase @@ -15,19 +15,22 @@ import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.data.mongodb.core.query.Criteria import org.springframework.data.mongodb.core.query.Query -open class MongodbQuery(override var clazz: Class, var template: MongoTemplate) : - IQuery { +/** + * 实现IQuery的Mongodb查询类 + * @param template MongodbRepo对象 + */ +open class MongodbQuery(var template: MongoTemplate) : IQuery { /** * 使用View解析是collection时是否校验存在,默认不校验 */ var validViewCollection = false - override fun get(id: ID): TView? { + override fun get(id: ID, clazz: Class): TView? { return this.template.findOne(whereId(id), clazz, this.collection(clazz)) } - override fun list(params: Map?): List { + override fun list(params: Map?, clazz: Class): List { val fields = this.fields(clazz) val query = Query() query.where(params, clazz) @@ -35,16 +38,16 @@ open class MongodbQuery(override var clazz: Class, var templat return this.find(query, clazz) } - override fun count(params: Map?): Int { + override fun count(params: Map?, clazz: Class): Long { val query = Query() - return this.template.count(query.where(params, clazz), this.collection(clazz)).toInt() + return this.template.count(query.where(params, clazz), this.collection(clazz)) } - override fun paging(params: Params): Page { + override fun paging(params: Params, clazz: Class): Page { val query = Query() val fields = this.fields(clazz) val result = Page(params.page, params.size) - result.total = this.count(params.parameters) + result.total = this.count(params.parameters, clazz) //如果总数和索引相同,说明该页没有数据,直接跳到上一页 if (result.total == result.index) { params.page -= 1 @@ -58,11 +61,11 @@ open class MongodbQuery(override var clazz: Class, var templat return result } - override fun range(field: String, params: List): List { + override fun range(field: String, params: List, clazz: Class): List { return this.find(Query.query(Criteria.where(field).`in`(params)), clazz) } - protected fun find(query: Query, clazz: Class): List { + protected fun find(query: Query, clazz: Class): List { return this.template.find(query, clazz, this.collection(clazz)) } diff --git a/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/query/MongodbQueryFactory.kt b/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/query/MongodbQueryFactory.kt deleted file mode 100644 index 46bd394..0000000 --- a/src/gaea.mongodb/src/main/kotlin/com/synebula/gaea/mongodb/db/query/MongodbQueryFactory.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.synebula.gaea.mongodb.db.query - -import com.synebula.gaea.db.query.IQuery -import com.synebula.gaea.db.query.IQueryFactory -import org.springframework.data.mongodb.core.MongoTemplate - -class MongodbQueryFactory(var template: MongoTemplate) : IQueryFactory { - - /** - * 创建IQuery接口类型 - */ - override fun createRawQuery(clazz: Class<*>): IQuery<*, *> { - val constructor = MongodbQuery::class.java.getConstructor(Class::class.java, MongoTemplate::class.java) - return constructor.newInstance(clazz, this.template) - } - - /** - * 创建IQuery接口类型 - */ - override fun createQuery(clazz: Class): IQuery { - return MongodbQuery(clazz, template) - } -} \ No newline at end of file diff --git a/src/gaea.spring/build.gradle b/src/gaea.spring/build.gradle index d283485..715d542 100644 --- a/src/gaea.spring/build.gradle +++ b/src/gaea.spring/build.gradle @@ -13,12 +13,3 @@ dependencies { api("org.springframework.boot:spring-boot-starter-aop:$spring_version") } - -publishing { - publications { - publish(MavenPublication) { - from components.java - } - } -} - diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/IQuery.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/IQuery.kt index 5f62bbb..9e8293a 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/IQuery.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/IQuery.kt @@ -5,27 +5,22 @@ package com.synebula.gaea.db.query * * @author alex */ -interface IQuery { - /** - * 仓储的视图类 - */ - var clazz: Class - +interface IQuery { /** * 根据Key获取对象。 * * @param id 对象Key。 * @return 视图结果 */ - fun get(id: ID): TView? + fun get(id: ID, clazz: Class): TView? /** * 根据实体类条件查询所有符合条件记录 - *` + * * @param params 查询条件。 * @return 视图列表 */ - fun list(params: Map?): List + fun list(params: Map?, clazz: Class): List /** * 根据条件查询符合条件记录的数量 @@ -33,7 +28,7 @@ interface IQuery { * @param params 查询条件。 * @return 数量 */ - fun count(params: Map?): Int + fun count(params: Map?, clazz: Class): Long /** * 根据实体类条件查询所有符合条件记录(分页查询) @@ -41,7 +36,7 @@ interface IQuery { * @param params 分页条件 * @return 分页数据 */ - fun paging(params: Params): Page + fun paging(params: Params, clazz: Class): Page /** * 查询条件范围内数据。 @@ -50,5 +45,5 @@ interface IQuery { * * @return 视图列表 */ - fun range(field: String, params: List): List + fun range(field: String, params: List, clazz: Class): List } diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/IQueryFactory.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/IQueryFactory.kt deleted file mode 100644 index 2535316..0000000 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/IQueryFactory.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.synebula.gaea.db.query - -/** - * Query 工厂接口。 定义了Query的创建方法。 - */ -interface IQueryFactory { - - /** - * 创建原始类型的IQuery接口类型 - */ - fun createRawQuery(clazz: Class<*>): IQuery<*, *> - - /** - * 创建指定类型的IQuery接口类型 - */ - fun createQuery(clazz: Class): IQuery -} \ No newline at end of file diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/Page.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/Page.kt index 5d3c039..5d65ee5 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/Page.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/db/query/Page.kt @@ -13,13 +13,13 @@ data class Page(var page: Int = 0, var size: Int = 0) { /** * 总数据量。 */ - var total: Int = 0 + var total: Long = 0 /** * 数据索引,从0开始。表示数据在总量的第几条。(index = (page - 1) * size ) */ - val index: Int - get() = (page - 1) * size + val index: Long + get() = (page - 1) * size.toLong() /** * 结果数据。 @@ -36,7 +36,7 @@ data class Page(var page: Int = 0, var size: Int = 0) { * @param data 结果数据。 */ - constructor(page: Int, size: Int, total: Int, data: List) : this(page, size) { + constructor(page: Int, size: Int, total: Long, data: List) : this(page, size) { this.page = page this.size = size this.total = total diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/domain/service/Service.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/domain/service/Service.kt index bf8d2f0..07147e3 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/domain/service/Service.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/domain/service/Service.kt @@ -24,9 +24,10 @@ open class Service, ID>( protected open var clazz: Class, protected open var repository: IRepository, protected open var mapper: IObjectMapper, - protected open var bus: IBus? = null ) : IService { + protected open var bus: IBus? = null + /** * 增加对象 *