SBaseService.kt 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  1. /*
  2. * ********************************************************************************************************************
  3. *
  4. * iFHS7.
  5. * ;BBMBMBMc rZMBMBR BMB
  6. * MBEr:;PBM, 7MBMMEOBB: BBB RBW
  7. * XK: BO SB. :SZ MBM. c;; ir BBM :FFr :SSF: ;xBMB:r iuGXv. i:. iF2;
  8. * DBBM0r. :D S7 ;XMBMB GMBMu. MBM: BMB MBMBBBMBMS WMBMBMBBK MBMBMBM BMBRBMBW .MBMBMBMBB
  9. * :JMRMMD .. , 1MMRM1; ;MBMBBR: MBM ;MB: BMB: MBM. RMBr sBMH BM0 UMB, BMB. KMBv
  10. * ;. XOW B1; :uM: 1RE, i .2BMBs rMB. MBO MBO JMB; MBB MBM BBS 7MBMBOBM: MBW :BMc
  11. * OBRJ.SEE MRDOWOR, 3DE:7OBM . ;BMB RMR7BM BMB MBB. BMB ,BMR .BBZ MMB rMB, BMM rMB7
  12. * :FBRO0D0 RKXSXPR. JOKOOMPi BMBSSWBMB; BMBB: MBMB0ZMBMS .BMBOXRBMB MBMDE RBM2;SMBM; MBB xBM2
  13. * iZGE O0SHSPO. uGZ7. sBMBMBDL :BMO OZu:BMBK, rRBMB0; ,EBMB xBMBr:ER. RDU :OO;
  14. * ,BZ, 1D0 RPSFHXR. xWZ .SMr . .BBB
  15. * :0BMRDG RESSSKR. 2WOMBW; BMBMR
  16. * i0BM: SWKHKGO MBDv
  17. * .UB OOGDM. MK, Copyright (c) 2015-2019. 斯伯坦机器人
  18. * , XMW ..
  19. * r All rights reserved.
  20. *
  21. * ********************************************************************************************************************
  22. */
  23. package com.sybotan.service
  24. import com.sybotan.base.extensions.getAllDeclaredField
  25. import com.sybotan.base.extensions.toJson
  26. import com.sybotan.database.*
  27. import com.sybotan.database.extensions.keyFieldList
  28. import com.sybotan.database.extensions.keyValue
  29. import com.sybotan.service.models.SCascadeQuery
  30. import com.sybotan.service.models.annotations.SCascade
  31. import com.sybotan.service.models.annotations.SCascadeCount
  32. import java.lang.reflect.Field
  33. import java.lang.reflect.ParameterizedType
  34. /**
  35. * 服务类基类
  36. *
  37. * @author 庞利祥 <sybotan@126.com>
  38. */
  39. open class SBaseService<ENTITY: Any> {
  40. /** 数据访问对象 */
  41. protected var baseDao: SAbstractDao<ENTITY>
  42. /** 实体类类型 */
  43. val entityClass: Class<ENTITY>
  44. get() = baseDao.entityClass
  45. /**
  46. * 构造函数
  47. *
  48. * @param entityClazz 实体类
  49. */
  50. constructor(entityClazz: Class<ENTITY>) {
  51. baseDao = daoFactory(entityClazz)
  52. } // Constructor()
  53. /**
  54. * 构造函数
  55. *
  56. * @param daoObject 数据访问对象
  57. */
  58. constructor(daoObject: SAbstractDao<ENTITY>) {
  59. baseDao = daoObject
  60. } // Constructor()
  61. /**
  62. * Dao对象工厂类
  63. *
  64. * @param entityClazz 实体类
  65. * @return 访问实体的Dao对象
  66. */
  67. private fun daoFactory(entityClazz: Class<ENTITY>): SAbstractDao<ENTITY> {
  68. @Suppress("UNCHECKED_CAST")
  69. val factory = Class.forName("com.sybotan.mybatis.SDaoFactory").newInstance() as SAbstractDaoFactory<ENTITY>
  70. return factory.createDao(entityClazz)
  71. } // Fun daoFactory
  72. /**
  73. * 在数据库中插入实体
  74. *
  75. * @param entity 插入数据库的实体
  76. * @return 插入是否成功
  77. */
  78. open fun insert(entity: ENTITY): Boolean {
  79. return baseDao.insert(entity)
  80. } // Fun insert()
  81. /**
  82. * 在数据库中插入实体
  83. *
  84. * @param entity 插入数据库的实体
  85. * @return 插入是否成功
  86. */
  87. open fun replace(entity: ENTITY): Boolean {
  88. return baseDao.replace(entity)
  89. } // Fun replace()
  90. /**
  91. * 删除实体
  92. *
  93. * @param entity 被删除的实体
  94. * @return 删除是否成功
  95. */
  96. open fun delete(entity: ENTITY): Boolean {
  97. return baseDao.delete(entity)
  98. } // Fun delete()
  99. /**
  100. * 根据条件删除
  101. *
  102. * @param args 删除条件
  103. * @return 删除是否成功
  104. */
  105. open fun delete(vararg args: Pair<String, Any>): Boolean {
  106. return baseDao.delete(*args)
  107. } // Fun delete()
  108. /**
  109. * 根据条件删除
  110. *
  111. * @param args 删除条件
  112. * @return 删除是否成功
  113. */
  114. open fun delete(vararg args: SFilter): Boolean {
  115. return baseDao.delete(*args)
  116. } // Fun delete()
  117. /**
  118. * 根据条件删除
  119. *
  120. * @param args 删除条件
  121. * @return 删除是否成功
  122. */
  123. open fun delete(args: List<SFilter>): Boolean {
  124. return baseDao.delete(args)
  125. } // Fun delete()
  126. /**
  127. * 根据条件删除
  128. *
  129. * @param query 删除条件
  130. * @return 删除是否成功
  131. */
  132. open fun delete(query: String): Boolean {
  133. return baseDao.delete(query)
  134. } // Fun delete()
  135. /**
  136. * 删除所有记录
  137. *
  138. * @return 删除是否成功
  139. */
  140. open fun deleteAll(): Boolean {
  141. return baseDao.deleteAll()
  142. } // Fun deleteAll()
  143. /**
  144. * 更新实体
  145. *
  146. * @param entity 更新实体
  147. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  148. * @return 更新是否成功
  149. */
  150. open fun update(entity: ENTITY, projection: ArrayList<String>? = null): Boolean {
  151. return baseDao.update(entity, projection)
  152. } // Fun update()
  153. /**
  154. * 根据条件更新
  155. *
  156. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  157. * @param args 更新条件
  158. * @return 更新是否成功
  159. */
  160. open fun update(entity: ENTITY, projection: ArrayList<String>?, vararg args: Pair<String, Any>): Boolean {
  161. return baseDao.update(entity, projection, *args)
  162. } // Fun update()
  163. /**
  164. * 根据条件更新
  165. *
  166. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  167. * @param args 更新条件
  168. * @return 更新是否成功
  169. */
  170. open fun update(entity: ENTITY, projection: ArrayList<String>?, vararg args: SFilter): Boolean {
  171. return baseDao.update(entity, projection, *args)
  172. } // Fun update()
  173. /**
  174. * 根据条件更新
  175. *
  176. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  177. * @param args 更新条件
  178. * @return 更新是否成功
  179. */
  180. open fun update(entity: ENTITY, projection: ArrayList<String>?, args: List<SFilter>): Boolean {
  181. return baseDao.update(entity, projection, args)
  182. } // Fun update()
  183. /**
  184. * 根据条件更新
  185. *
  186. * @param projection 将被更新的字段列表(以逗号分隔),为空表示更新所有非空字段
  187. * @param query 更新条件
  188. * @return 更新是否成功
  189. */
  190. open fun update(entity: ENTITY, projection: ArrayList<String>?, query: String): Boolean {
  191. return baseDao.update(entity, projection, query)
  192. } // Fun update()
  193. /**
  194. * 根据条件查询一条记录
  195. *
  196. * @param args 查询条件
  197. */
  198. open fun select(vararg args: Pair<String, Any>): SQueryBuilder<ENTITY> {
  199. return baseDao.select(*args)
  200. } // Fun select()
  201. /**
  202. * 根据条件查询记录
  203. *
  204. * @param args 查询条件
  205. * @return 查询构造器
  206. */
  207. open fun select(vararg args: SFilter): SQueryBuilder<ENTITY> {
  208. return baseDao.select(*args)
  209. } // Fun select()
  210. /**
  211. * 根据条件查询记录
  212. *
  213. * @param args 查询条件
  214. * @return 查询构造器
  215. */
  216. open fun select(args: List<SFilter>): SQueryBuilder<ENTITY> {
  217. return baseDao.select(args)
  218. } // Fun select()
  219. /**
  220. * 根据条件查询记录
  221. *
  222. * @param query 查询条件
  223. * @return 查询构造器
  224. */
  225. open fun select(query: String?): SQueryBuilder<ENTITY> {
  226. return baseDao.select(query)
  227. } // Fun select()
  228. /**
  229. * 根据条件查询所有记录
  230. *
  231. * @return 查找的记录
  232. */
  233. open fun selectAll(): SQueryBuilder<ENTITY> {
  234. return baseDao.selectAll()
  235. } // Fun selectAll()
  236. /**
  237. * 执行查询操作
  238. *
  239. * @param builder 查询查询构造器
  240. * @return 查询到的记录
  241. */
  242. open fun execQuery(builder: SQueryBuilder<ENTITY>): ArrayList<ENTITY> {
  243. return baseDao.execQuery(builder)
  244. } // Fun execQuery()
  245. /**
  246. * 执行查询操作
  247. *
  248. * @param builder 查询查询构造器
  249. * @return 查询到的记录数
  250. */
  251. open fun execCount(builder: SQueryBuilder<ENTITY>): Long {
  252. return baseDao.execCount(builder)
  253. } // Fun execQuery()
  254. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  255. // 回调函数
  256. /**
  257. * 创建对象前回调函数
  258. *
  259. * @param entity 创建前的回调函数
  260. * @return 返回true,可以创建对象
  261. */
  262. protected open fun onCreateBefore(entity: ENTITY): Boolean {
  263. return true
  264. } // Fun onCreateBefore()
  265. /**
  266. * 创建成功后回调函数
  267. *
  268. * @param entityList 创建成功对象列表
  269. */
  270. protected open fun onCreateSuccess(entityList: ArrayList<ENTITY>) {
  271. } // Fun onCreateSuccess()
  272. /**
  273. * 创建失败回调函数
  274. *
  275. * @param entityList 创建失败对象列表
  276. */
  277. protected open fun onCreateFailure(entityList: ArrayList<ENTITY>) {
  278. } // Fun onCreateFailure()
  279. /**
  280. * 删除前回调函数
  281. *
  282. * @param entity 创建前的回调函数
  283. * @return 返回true,可以删除对象
  284. */
  285. protected open fun onDeleteBefore(entity: ENTITY): Boolean {
  286. return true
  287. } // Fun onCreateEntity()
  288. /**
  289. * 删除成功回调函数
  290. *
  291. * @param entityList 删除成功对象列表
  292. */
  293. protected open fun onDeleteSuccess(entityList: ArrayList<ENTITY>) {
  294. } // Fun onDeleteSuccess()
  295. /**
  296. * 删除失败回调函数
  297. *
  298. * @param entityList 删除失败对象列表
  299. */
  300. protected open fun onDeleteFailure(entityList: ArrayList<ENTITY>) {
  301. } // Fun onDeleteFailure()
  302. /**
  303. * 更新前回调函数
  304. *
  305. * @param entity 创建前的回调函数
  306. */
  307. protected open fun onUpdateBefore(entity: ENTITY): Boolean {
  308. return true
  309. } // Fun onCreateEntity()
  310. /**
  311. * 更新成功能回调函数
  312. *
  313. * @param entityList 更新成功对象列表
  314. */
  315. protected open fun onUpdateSuccess(entityList: ArrayList<ENTITY>) {
  316. } // Fun onUpdateSuccess()
  317. /**
  318. * 更新失败回调函数
  319. *
  320. * @param entityList 更新失败对象列表
  321. */
  322. protected open fun onUpdateFailure(entityList: ArrayList<ENTITY>) {
  323. } // Fun onUpdateFailure()
  324. /**
  325. * 查询前回调函数
  326. *
  327. * @param queryBuilder 查询构造器
  328. */
  329. protected open fun onQueryBefore(queryBuilder: SQueryBuilder<ENTITY>) {
  330. } // Fun onQueryBefore()
  331. /**
  332. * 查询成功回调函数
  333. *
  334. * @param pageInfo 页面信息
  335. */
  336. protected open fun onQuerySuccess(pageInfo: SPageQueryInfo<ENTITY>) {
  337. } // Fun onQuerySuccess()
  338. /**
  339. * 统计个数前回调函数
  340. *
  341. * @param queryBuilder 查询构造器
  342. */
  343. protected open fun onCountBefore(queryBuilder: SQueryBuilder<ENTITY>) {
  344. } // Fun onQueryBefore()
  345. /**
  346. * 统计个数成功回调函数
  347. *
  348. * @param count 统计结果
  349. */
  350. protected open fun onCountSuccess(count: Long) {
  351. } // Fun onCountSuccess()
  352. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  353. // 级联操作相关
  354. /**
  355. * 进行级联查询处理
  356. *
  357. * @param entityList 实体列表
  358. * @param cascadeList 级联请求列表
  359. */
  360. fun processCascadeQuery(entityList: ArrayList<Any>, cascadeList: ArrayList<SCascadeQuery>) {
  361. val entityMap = entityListToMap(entityList)
  362. for (cascade in cascadeList) {
  363. if (cascade.name == null) {
  364. continue
  365. }
  366. // 获得级联相关信息。如果信息不完整,则退出
  367. val cascadeField = entityClass.getAllDeclaredField(cascade.name!!) ?: continue
  368. val cascadeQueryAnno = cascadeField.getAnnotation(SCascade::class.java)
  369. val cascadeCountAnno = cascadeField.getAnnotation(SCascadeCount::class.java)
  370. if (cascadeQueryAnno != null) {
  371. cascadeQuery(entityMap, cascadeQueryAnno, cascadeField, cascade)
  372. } else if (cascadeCountAnno != null) {
  373. cascadeCount(entityMap, cascadeCountAnno, cascadeField, cascade)
  374. }
  375. }
  376. return
  377. } // Fun cascadeQuery()
  378. /**
  379. * 进行级联查询
  380. *
  381. * @param entityMap 实体Map
  382. * @param cascadeAnno 级联查询注解
  383. * @param cascadeField 级联查询对应的属性
  384. * @param cascade 级联请求
  385. */
  386. private fun cascadeQuery(entityMap: HashMap<Any, Any>, cascadeAnno: SCascade, cascadeField: Field, cascade: SCascadeQuery) {
  387. val cascadeClass = if (List::class.java.isAssignableFrom(cascadeField.type)) {
  388. // 如果是1对多,或多对多。取列表的泛型
  389. (cascadeField.genericType as ParameterizedType).actualTypeArguments[0] as Class<*>
  390. } else {
  391. // 如果为1对1,直接取对象类型
  392. cascadeField.type
  393. }
  394. val idList = entityIdList(entityMap)
  395. val relationList = baseDao.relationQuery(cascadeAnno.table, cascadeAnno.idColumn, cascadeAnno.childIdColumn, cascadeAnno.self, cascadeAnno.filter, idList)
  396. // 如果未取到关联数据,则开始取下一个关联对象
  397. if (relationList.size <= 0) {
  398. return
  399. }
  400. val relationMap = relationListToMap(relationList)
  401. /////////////////////////////////
  402. // 开始构造级联查询
  403. val service = SBaseService(cascadeClass)
  404. val sqlBuilder = service.select(cascade.filters)
  405. sqlBuilder.filter(SFilter.inList(cascadeClass.keyFieldList()[0].name, relationMap.keys.toList()))
  406. /** 排序条件 */
  407. if (null != cascade.orders) {
  408. sqlBuilder.order(cascade.orders!!)
  409. }
  410. /** 去重 */
  411. if (null != cascade.distinct && cascade.distinct!!) {
  412. sqlBuilder.distinct()
  413. }
  414. /** 映射标志 */
  415. if (null != cascade.projection) {
  416. sqlBuilder.projection(cascade.projection!!)
  417. }
  418. /** 分组统计 */
  419. if (null != cascade.group && !cascade.group!!.nameList.isNullOrEmpty()) {
  420. // 分组属性名列表
  421. sqlBuilder.group(*cascade.group!!.nameList.toArray(emptyArray<String>()))
  422. // 是否统计个数
  423. sqlBuilder.count(cascade.group!!.count ?: false)
  424. // 求和
  425. if (!cascade.group!!.sumList.isNullOrEmpty()) {
  426. sqlBuilder.sum(*cascade.group!!.sumList.toArray(emptyArray<String>()))
  427. }
  428. // 求平均值
  429. if (!cascade.group!!.avgList.isNullOrEmpty()) {
  430. sqlBuilder.avg(*cascade.group!!.avgList.toArray(emptyArray<String>()))
  431. }
  432. // 取最大值
  433. if (!cascade.group!!.maxList.isNullOrEmpty()) {
  434. sqlBuilder.max(*cascade.group!!.maxList.toArray(emptyArray<String>()))
  435. }
  436. // 取最小值
  437. if (!cascade.group!!.minList.isNullOrEmpty()) {
  438. sqlBuilder.min(*cascade.group!!.minList.toArray(emptyArray<String>()))
  439. }
  440. }
  441. val childrenList = sqlBuilder.exec()
  442. for (child in childrenList) {
  443. val childKey = child::class.java.keyFieldList()[0].name
  444. val id2 = child.keyValue(childKey)
  445. @Suppress("UNCHECKED_CAST")
  446. val id1List = relationMap[id2] as ArrayList<Any?>?
  447. id1List ?: continue
  448. for (id1 in id1List) {
  449. if (entityMap[id1] != null) {
  450. fillCascadeObject(entityMap[id1]!!, child, cascadeField)
  451. }
  452. }
  453. }
  454. /** 如果需要进行级联查询 */
  455. if (cascade.cascade != null && cascade.cascade!!.size > 0 &&
  456. childrenList.size > 0) {
  457. @Suppress("UNCHECKED_CAST")
  458. service.processCascadeQuery(childrenList as ArrayList<Any>, cascade.cascade!!)
  459. }
  460. return
  461. } // Fun cascadeQuery()
  462. /**
  463. * 进行级联查询
  464. *
  465. * @param entityMap 实体Map
  466. * @param cascadeAnno 级联查询注解
  467. * @param cascadeField 级联查询对应的属性
  468. * @param cascade 级联请求
  469. */
  470. private fun cascadeCount(entityMap: HashMap<Any, Any>, cascadeAnno: SCascadeCount, cascadeField: Field, cascade: SCascadeQuery) {
  471. val idList = entityIdList(entityMap)
  472. val relationList = baseDao.relationQuery(cascadeAnno.table, cascadeAnno.idColumn, cascadeAnno.childIdColumn, cascadeAnno.self, cascadeAnno.filter, idList)
  473. // 如果未取到关联数据,则开始取下一个关联对象
  474. if (relationList.size <= 0) {
  475. return
  476. }
  477. val relationMap = relationListToMap(relationList)
  478. /////////////////////////////////
  479. // 开始构造级联查询
  480. val service = SBaseService(cascadeAnno.childClass.java)
  481. val sqlBuilder = service.select(cascade.filters)
  482. sqlBuilder.filter(SFilter.inList(cascadeAnno.childClass.java.keyFieldList()[0].name, relationMap.keys.toList()))
  483. /** 排序条件 */
  484. if (null != cascade.orders) {
  485. sqlBuilder.order(cascade.orders!!)
  486. }
  487. /** 去重 */
  488. if (null != cascade.distinct && cascade.distinct!!) {
  489. sqlBuilder.distinct()
  490. }
  491. /** 映射标志 */
  492. if (null != cascade.projection) {
  493. sqlBuilder.projection(cascade.projection!!)
  494. }
  495. /** 分组统计 */
  496. if (null != cascade.group && !cascade.group!!.nameList.isNullOrEmpty()) {
  497. // 分组属性名列表
  498. sqlBuilder.group(*cascade.group!!.nameList.toArray(emptyArray<String>()))
  499. // 是否统计个数
  500. sqlBuilder.count(cascade.group!!.count ?: false)
  501. // 求和
  502. if (!cascade.group!!.sumList.isNullOrEmpty()) {
  503. sqlBuilder.sum(*cascade.group!!.sumList.toArray(emptyArray<String>()))
  504. }
  505. // 求平均值
  506. if (!cascade.group!!.avgList.isNullOrEmpty()) {
  507. sqlBuilder.avg(*cascade.group!!.avgList.toArray(emptyArray<String>()))
  508. }
  509. // 取最大值
  510. if (!cascade.group!!.maxList.isNullOrEmpty()) {
  511. sqlBuilder.max(*cascade.group!!.maxList.toArray(emptyArray<String>()))
  512. }
  513. // 取最小值
  514. if (!cascade.group!!.minList.isNullOrEmpty()) {
  515. sqlBuilder.min(*cascade.group!!.minList.toArray(emptyArray<String>()))
  516. }
  517. }
  518. val childrenList = sqlBuilder.exec()
  519. for (child in childrenList) {
  520. val childKey = child::class.java.keyFieldList()[0].name
  521. val id2 = child.keyValue(childKey)
  522. @Suppress("UNCHECKED_CAST")
  523. val id1List = relationMap[id2] as ArrayList<Any?>?
  524. id1List ?: continue
  525. for (id1 in id1List) {
  526. if (entityMap[id1] != null) {
  527. fillCascadeCount(entityMap[id1]!!, child, cascadeField)
  528. }
  529. }
  530. }
  531. return
  532. } // Fun cascadeCount()
  533. /**
  534. * 为加速填充级联对象,将实体列表转换为map。
  535. *
  536. * @param entityList 实体列表
  537. * @return 以Map形式存储的实体
  538. */
  539. private fun entityListToMap(entityList: ArrayList<Any>): HashMap<Any, Any> {
  540. val map = HashMap<Any, Any>()
  541. val key = entityClass.keyFieldList()[0]
  542. for (entity in entityList) {
  543. map[entity.keyValue(key.name)!!] = entity
  544. }
  545. return map
  546. } // Fun entityMap()
  547. /**
  548. * 获得实体的Id列表
  549. *
  550. * @param entityMap 实体Map
  551. * @return ID列表
  552. */
  553. private fun entityIdList(entityMap: HashMap<Any, Any>): ArrayList<Any> {
  554. val idList = ArrayList<Any>()
  555. for (entity in entityMap) {
  556. val keyField = entity.value.javaClass.keyFieldList()[0]
  557. val keyValue = entity.value.keyValue(keyField.name)!!
  558. println("keyField=${keyField.toJson()}")
  559. println("keyValue=${keyValue.toJson()}")
  560. idList.add(keyValue)
  561. }
  562. return idList
  563. } // Fun entityIdList()
  564. /**
  565. * 将关系列表转换为Map
  566. *
  567. * @param cascadeList 被转换的列表
  568. * @return 转换后的Map
  569. */
  570. private fun relationListToMap(cascadeList: List<HashMap<String, Any>>): HashMap<Any, ArrayList<Any>> {
  571. val map = HashMap<Any, ArrayList<Any>>()
  572. for (item in cascadeList) {
  573. item["id2"] ?: continue
  574. var list = map[item["id2"]!!]
  575. if (list == null) {
  576. list = ArrayList()
  577. }
  578. list.add(item["id1"]!!)
  579. map[item["id2"]!!] = list
  580. }
  581. return map
  582. } // Fun cascadeToMap()
  583. /**
  584. * 填级联对象
  585. *
  586. * @param entity 实体
  587. * @param child 填入的对象
  588. * @param field 填入的对象对应的实体类属性
  589. */
  590. private fun fillCascadeObject(entity: Any, child: Any?, field: Field) {
  591. // 如果child为空,则返回
  592. child ?: return
  593. // 保存访问权限
  594. val accessible = field.isAccessible
  595. field.isAccessible = true
  596. // 如果field是列表
  597. if (List::class.java.isAssignableFrom(field.type)) {
  598. @Suppress("UNCHECKED_CAST")
  599. var children = field.get(entity) as ArrayList<Any>?
  600. if (children == null) {
  601. children = ArrayList()
  602. }
  603. children.add(child)
  604. field.set(entity, children)
  605. } else {
  606. // 如果field是对象
  607. if (field.get(entity) == null) {
  608. field.set(entity, child)
  609. }
  610. }
  611. // 恢复访问权限
  612. field.isAccessible = accessible
  613. return
  614. } // Fun fillCascadeObject()
  615. /**
  616. * 填级联对象
  617. *
  618. * @param entity 实体
  619. * @param child 填入的对象
  620. * @param field 填入的对象对应的实体类属性
  621. */
  622. private fun fillCascadeCount(entity: Any, child: Any?, field: Field) {
  623. // 如果child为空,则返回
  624. child ?: return
  625. // 保存访问权限
  626. val accessible = field.isAccessible
  627. field.isAccessible = true
  628. @Suppress("UNCHECKED_CAST")
  629. var count = field.get(entity) as? Int
  630. if (count == null) {
  631. count = 0
  632. }
  633. count++
  634. field.set(entity, count)
  635. // 恢复访问权限
  636. field.isAccessible = accessible
  637. return
  638. } // Fun fillCascadeCount()
  639. } // Class SBaseService