SPostgreSqlDriver.kt 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. /*
  2. * *********************************************************************************************************************
  3. *
  4. * !!
  5. * .F88X
  6. * X8888Y
  7. * .}888888N;
  8. * i888888N; .:! .I$WI:
  9. * R888888I .'N88~ i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
  10. * .R888888I .;N8888~ .X8' "8I.!,/8" !%NY8`"8I8~~8>,88I
  11. * +888888N; .8888888Y "&&8Y.}8,
  12. * ./888888N; .R888888Y .'}~ .>}'.`+> i}! "i' +/' .'i~ !11,.:">, .~]! .i}i
  13. * ~888888%: .I888888l .]88~`1/iY88Ii+1'.R$8$8]"888888888> Y8$ W8E X8E W8888'188Il}Y88$*
  14. * 18888888 E8888881 .]W%8$`R8X'&8%++N8i,8N%N8+l8%` .}8N:.R$RE%N88N%N$K$R 188,FE$8%~Y88I
  15. * .E888888I .i8888888' .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
  16. * 8888888I .,N888888~ ~88i"8W,!N8*.I88.}888%F,i$88"F88" 888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
  17. * i888888N' I888Y ]88;/EX*IFKFK88X K8R .l8W 88Y ~88}'88E&%8W.X8N``]88!.$8K .:W8I
  18. * .i888888N; I8Y .&8$ .X88! i881.:%888>I88 ;88] +88+.';;;;:.Y88X 18N.,88l .+88/
  19. * .:R888888I
  20. * .&888888I Copyright (c) 2009-2020. 博锐尚格科技股份有限公司
  21. * ~8888'
  22. * .!88~ All rights reserved.
  23. *
  24. * *********************************************************************************************************************
  25. */
  26. package com.persagy.postgresql
  27. import com.persagy.base.extensions.isBaseType
  28. import com.persagy.base.extensions.toJson
  29. import com.persagy.base.extensions.toJsonAll
  30. import com.persagy.database.*
  31. import com.persagy.database.enums.SDatabaseType
  32. import com.persagy.database.enums.SOps
  33. import com.persagy.gis.entity.SAbstractGisGeometry
  34. import com.persagy.mybatis.SAbstractDriver
  35. import com.persagy.mybatis.SSqlProvider
  36. import org.apache.ibatis.jdbc.SQL
  37. import org.slf4j.LoggerFactory
  38. /**
  39. * PostgreSQL 驱动
  40. *
  41. * @author 庞利祥 <sybotan@126.com>
  42. */
  43. class SPostgreSqlDriver : SAbstractDriver() {
  44. /** 静态对象 */
  45. companion object {
  46. /** 日志记录器 */
  47. private val logger = LoggerFactory.getLogger(SPostgreSqlDriver::class.java)
  48. }
  49. /**
  50. * 在数据库中插入实体
  51. *
  52. * @param argsMap 注入参数
  53. * @return 插入 SQL 语句
  54. */
  55. @Suppress("UNCHECKED_CAST")
  56. override fun insert(argsMap: Map<String, Any?>): String {
  57. val builder = argsMap["builder"] as SInsetBuilder<*>
  58. val entityClass = argsMap["entityClass"] as Class<*>
  59. val entity = argsMap["entity"] as HashMap<String, Any?>
  60. val sql = object: SQL() {
  61. init {
  62. /** 如果查询构建器朱指定了表名 */
  63. if (builder!=null&&!builder.tableName.isNullOrEmpty()) {
  64. INSERT_INTO(builder.tableName!!)
  65. } else {
  66. INSERT_INTO(SSqlProvider.driver.tableName(entityClass))
  67. }
  68. for ((key, value) in entity) {
  69. if (value != null) {
  70. if (value is Map<*,*>) {
  71. VALUES(SSqlProvider.driver.escName(key), "'${value.toJsonAll().replace("'", "''")}'")
  72. } else if (value is List<*>) {
  73. VALUES(SSqlProvider.driver.escName(key), "'${value.toJsonAll().replace("'", "''")}'")
  74. } else if (value::class.java.isPrimitive){
  75. VALUES(SSqlProvider.driver.escName(key), "'${value.toJsonAll().replace("'", "''")}'")
  76. } else if (value is SAbstractGisGeometry) {
  77. VALUES(SSqlProvider.driver.escName(key), "ST_GeomFromText('${value.toWkt()}')")
  78. } else {
  79. VALUES(SSqlProvider.driver.escName(key), SSqlProvider.driver.entityValue(entity, key))
  80. }
  81. // if (value::class.java.isPrimitive) {
  82. // VALUES(driver.escName(key), driver.entityValue(entity, key))
  83. // } else {
  84. // VALUES(driver.escName(key), "'${value.toJsonAll()}'")
  85. // }
  86. }
  87. }
  88. }
  89. }.toString()
  90. logger.debug("INSERT SQL= $sql")
  91. return sql
  92. }
  93. /**
  94. * 在数据库中替换实体
  95. *
  96. * @param argsMap 注入参数
  97. *
  98. * @return 替换 SQL 语句
  99. */
  100. @Suppress("UNCHECKED_CAST")
  101. override fun replace(argsMap: Map<String, Any?>): String {
  102. val sql: String
  103. val builder = argsMap["builder"] as SReplaceBuilder<*>
  104. val entity = argsMap["entity"] as Map<String, Any?>
  105. val keyColumnList = argsMap["keyColumnList"] as ArrayList<String>
  106. val upSqlBuilder = StringBuilder()
  107. logger.debug("entity=${entity.toJson()}")
  108. for ((key, value) in entity) {
  109. if (value != null) {
  110. if (upSqlBuilder.length > 1) {
  111. upSqlBuilder.append(",")
  112. }
  113. if (value is Map<*,*>) {
  114. upSqlBuilder.append("${escName(key)} = '${value.toJsonAll().replace("'", "''")}'")
  115. } else if (value is List<*>) {
  116. upSqlBuilder.append("${escName(key)} = '${value.toJsonAll().replace("'", "''")}'")
  117. } else if (value::class.java.isPrimitive){
  118. upSqlBuilder.append("${escName(key)} = '${value.toJsonAll().replace("'", "''")}'")
  119. } else if (value is SAbstractGisGeometry) {
  120. upSqlBuilder.append("${escName(key)} = ST_GeomFromText('${value.toWkt()}')")
  121. // VALUES(SSqlProvider.driver.escName(key), "ST_GeomFromText('${value.toWkt()}')")
  122. } else {
  123. upSqlBuilder.append("${escName(key)} = #{entity.$key}")
  124. }
  125. // if (value::class.java.isPrimitive) {
  126. // upSqlBuilder.append("${escName(key)} = #{entity.$key}")
  127. // } else {
  128. // upSqlBuilder.append("${escName(key)} = '${value.toJsonAll()}'")
  129. // }
  130. } else {
  131. // 维新有特殊要求
  132. // if (upSqlBuilder.length > 1) {
  133. // upSqlBuilder.append(",")
  134. // }
  135. // upSqlBuilder.append("${driver.keyEsc}$key${driver.keyEsc} = null")
  136. }
  137. }
  138. val confict = StringBuilder()
  139. keyColumnList.forEach {
  140. if (confict.length > 1) {
  141. confict.append(",")
  142. }
  143. confict.append("\"$it\"")
  144. }
  145. sql = "${replaceInsert(argsMap)} ON conflict ( $confict ) DO UPDATE SET $upSqlBuilder"
  146. logger.debug("REPLACE SQL= $sql")
  147. return sql
  148. }
  149. // @Suppress("UNCHECKED_CAST")
  150. // open fun update(argsMap: Map<String, Any?>): String {
  151. //
  152. // }
  153. /**
  154. * 根据条件更新
  155. *
  156. * @param argsMap 注入参数
  157. * @return 更新 SQL 语句
  158. */
  159. override fun update(argsMap: Map<String, Any?>): String {
  160. val entityClass = argsMap["entityClass"] as Class<*>
  161. val entity = argsMap["entity"] as HashMap<String, Any?>
  162. val filterArgs = argsMap["filterArgs"] as List<SFilter>
  163. val whereArgs = argsMap["whereArgs"] as HashMap<String, Any>
  164. val nullItemList = ArrayList<String>()
  165. if (argsMap.containsKey("nullItems")) {
  166. val fields = argsMap["nullItems"] as ArrayList<String>?
  167. /** 转换属性名 */
  168. fields?.forEach {
  169. try {
  170. val colName = SAbstractDao.columnName(entityClass, it.trim())
  171. nullItemList.add(colName)
  172. } catch (e: Exception) {
  173. e.printStackTrace()
  174. }
  175. }
  176. }
  177. // val updateNull = fieldList.size > 0
  178. //
  179. val clause = buildWhereArgList(entityClass, filterArgs, whereArgs)
  180. val sql = object: SQL() {
  181. init {
  182. UPDATE(SSqlProvider.driver.tableName(entityClass))
  183. // 遍历传入的对象的属性 键值
  184. for ((key, value) in entity) {
  185. // if (nullItemList.size > 0 && !nullItemList.contains(key)) {
  186. // continue
  187. // }
  188. // if (value == null && updateNull) {
  189. // // PostgreSQL使用参数更新,为空更新不成功。必须使用sql直接设置
  190. // SET("${SSqlProvider.driver.escName(key)} = null")
  191. // }
  192. // 值不为空的更新
  193. if (value != null) {
  194. if (value is Map<*,*>) {
  195. SET("${SSqlProvider.driver.escName(key)} = ${SSqlProvider.driver.updateJson(key, value)}")
  196. }else if (value is List<*>) {
  197. SET("${SSqlProvider.driver.escName(key)} = ${SSqlProvider.driver.updateJson(key, value)}")
  198. } else if (value is SAbstractGisGeometry) {
  199. SET("${SSqlProvider.driver.escName(key)} = ST_GeomFromText('${value.toWkt()}')")
  200. } else {
  201. SET("${SSqlProvider.driver.escName(key)} = ${SSqlProvider.driver.entityValue(entity, key)}")
  202. }
  203. // if (value::class.java.isPrimitive) {
  204. // SET("${driver.keyEsc}$key${driver.keyEsc} = ${driver.entityValue(entity, key)}")
  205. // } else {
  206. // SET("${driver.keyEsc}$key${driver.keyEsc} = ${driver.updateJson(key, value)}")
  207. // }
  208. }
  209. }
  210. // 遍历置空属性列表
  211. for (nullItem in nullItemList){
  212. // PostgreSQL使用参数更新,为空更新不成功。必须使用sql直接设置
  213. val pos = nullItem.indexOf(".")
  214. if (pos > 0){
  215. SET(SSqlProvider.driver.updateNullItem(nullItem))
  216. }else{
  217. SET("${SSqlProvider.driver.escName(nullItem)} = null")
  218. }
  219. }
  220. // 更新条件为空不拼接条件
  221. if (clause.isNotEmpty()) {
  222. WHERE(clause)
  223. }
  224. }
  225. }.toString()
  226. logger.debug("SQL= $sql")
  227. return sql
  228. }
  229. /**
  230. * 根据条件删除
  231. *
  232. * @param argsMap 注入参数
  233. * @return 删除 SQL 语句
  234. */
  235. @Suppress("UNCHECKED_CAST")
  236. override fun delete(argsMap: Map<String, Any?>): String {
  237. val builder = argsMap["builder"] as SDeleteBuilder<*>
  238. val entityClass = argsMap["entityClass"] as Class<*>
  239. /** 从入参中获得过虑条件 */
  240. val filterArgs = argsMap["filterArgs"] as List<SFilter>
  241. /** 转换后的where语句参数 */
  242. val whereArgs = argsMap["whereArgs"] as HashMap<String, Any>
  243. val clause = buildWhereArgList(entityClass, filterArgs, whereArgs)
  244. val sql = object: SQL() {
  245. init {
  246. /** 如果查询构建器朱指定了表名 */
  247. if (builder!=null&&!builder.tableName.isNullOrEmpty()) {
  248. DELETE_FROM(builder.tableName!!)
  249. } else {
  250. DELETE_FROM(SSqlProvider.driver.tableName(entityClass))
  251. }
  252. if (clause.isNotEmpty()) {
  253. WHERE(clause)
  254. }
  255. }
  256. }.toString()
  257. logger.debug("SQL= $sql")
  258. return sql
  259. }
  260. /**
  261. * 删除所有记录
  262. *
  263. * @param argsMap 注入参数
  264. * @return 删除 SQL 语句
  265. */
  266. @Suppress("UNCHECKED_CAST")
  267. override fun deleteAll(argsMap: Map<String, Any?>): String {
  268. val builder = argsMap["builder"] as SDeleteBuilder<*>?
  269. val entityClass = argsMap["entityClass"] as Class<*>
  270. val sql = object: SQL() {
  271. init {
  272. if (builder!=null&&!builder.tableName.isNullOrEmpty()) {
  273. DELETE_FROM(builder.tableName!!)
  274. } else {
  275. DELETE_FROM(SSqlProvider.driver.tableName(entityClass))
  276. }
  277. }
  278. }.toString()
  279. logger.debug("SQL= $sql")
  280. return sql
  281. }
  282. /**
  283. * 执行查询操作
  284. *
  285. * @param argsMap 注入参数
  286. * @return 查询 SQL 语句
  287. */
  288. @Suppress("UNCHECKED_CAST")
  289. override fun execQuery(argsMap: Map<String, Any?>): String {
  290. val entityClass = argsMap["entityClass"] as Class<*>
  291. val builder = argsMap["builder"] as SQueryBuilder<*>
  292. val whereArgs = argsMap["whereArgs"] as HashMap<String, Any>
  293. val clause = buildWhereArgList(entityClass, builder.filterList, whereArgs)
  294. var sql = object: SQL() {
  295. init {
  296. logger.debug("333333333333333")
  297. /** 如果选择去重 */
  298. if (builder.isDistinct) {
  299. SELECT_DISTINCT(buildColumns(entityClass, builder.fieldList))
  300. } else {
  301. SELECT(buildColumns(entityClass, builder.fieldList))
  302. }
  303. /** 如果查询构建器朱指定了表名 */
  304. if (builder.tableName.isNullOrEmpty()) {
  305. FROM(SSqlProvider.driver.tableName(entityClass))
  306. } else {
  307. FROM(builder.tableName!!)
  308. }
  309. /** 过滤条件 */
  310. if (clause.isNotEmpty()) {
  311. WHERE(clause)
  312. }
  313. /** 排序条件 */
  314. for (col in builder.orderArgs) {
  315. var path: String? = null
  316. var propertyName = col.name
  317. val pos = propertyName.indexOf(".")
  318. if (pos > 0) {
  319. path = propertyName.substring(pos + 1)
  320. propertyName = propertyName.substring(0, pos)
  321. }
  322. val colName = SAbstractDao.columnName(entityClass, SAbstractDao.propertyName(entityClass, propertyName))
  323. ORDER_BY("${SSqlProvider.driver.columnName(colName, path)} ${col.direction}")
  324. }
  325. /** 分组 */
  326. if (!builder.group.nameList.isNullOrEmpty()) {
  327. for (name in builder.group.nameList) {
  328. val colName = SAbstractDao.columnName(entityClass, name)
  329. GROUP_BY(SSqlProvider.driver.escName(colName))
  330. }
  331. if (builder.group.count !=null && builder.group.count!!) {
  332. SELECT("count(1) as _statistics_count")
  333. }
  334. if (!builder.group.sumList.isNullOrEmpty()) {
  335. for (name in builder.group.sumList) {
  336. val colName = SAbstractDao.columnName(entityClass, SAbstractDao.propertyName(entityClass, name))
  337. SELECT("sum(${SSqlProvider.driver.columnName(colName, null)}) as _statistics_sum_$name")
  338. }
  339. }
  340. if (!builder.group.avgList.isNullOrEmpty()) {
  341. for (name in builder.group.sumList) {
  342. val colName = SAbstractDao.columnName(entityClass, SAbstractDao.propertyName(entityClass, name))
  343. SELECT("avg(${SSqlProvider.driver.columnName(colName, null)}) as _statistics_avg_$name")
  344. }
  345. }
  346. if (!builder.group.maxList.isNullOrEmpty()) {
  347. for (name in builder.group.sumList) {
  348. val colName = SAbstractDao.columnName(entityClass, SAbstractDao.propertyName(entityClass, name))
  349. SELECT("max(${SSqlProvider.driver.columnName(colName, null)}) as _statistics_max_$name")
  350. }
  351. }
  352. if (!builder.group.minList.isNullOrEmpty()) {
  353. for (name in builder.group.sumList) {
  354. val colName = SAbstractDao.columnName(entityClass, SAbstractDao.propertyName(entityClass, name))
  355. SELECT("min(${SSqlProvider.driver.columnName(colName, null)}) as _statistics_min_$name")
  356. }
  357. }
  358. }
  359. }
  360. }.toString()
  361. if (builder.count != null) {
  362. sql += SSqlProvider.driver.limit(builder.offset, builder.count)
  363. }
  364. logger.debug("SQL= $sql")
  365. return sql
  366. }
  367. /**
  368. * 获得表名,取实体类 @Table 注解的名称,如果没有注解,则取实体类类名。
  369. *
  370. * @param clz mapper 类类型
  371. * @return 表名
  372. */
  373. override fun tableName(clz: Class<*>): String {
  374. val tableAnno = clz.getAnnotation(javax.persistence.Table::class.java)
  375. // 如果有@Table注解,则取注解的表名;否则使用类名做为表名
  376. val tableName = tableAnno?.name ?: clz.simpleName
  377. val name = tableName.replace(".", "\".\"")
  378. return "\"$name\""
  379. }
  380. /**
  381. * 将 name 加上引用符号
  382. *
  383. * @param name 名称
  384. * @return 加上引用符号的名称
  385. */
  386. override fun escName(name: String): String {
  387. return "\"$name\""
  388. }
  389. /**
  390. * 实体类的值,如果不是基本类型,则转换为 json
  391. *
  392. * @param entity 实体类
  393. * @param name 名称
  394. * @return 加上引用符号的名称
  395. */
  396. override fun entityValue(entity: HashMap<String, Any?>, name: String): String {
  397. val value = entity[name] ?: return "null"
  398. if (value.isBaseType()) {
  399. return "#{entity.$name}"
  400. }
  401. return "'${value.toJson()}'"
  402. }
  403. /**
  404. * 生成 limit 语句
  405. *
  406. * @param offset 偏移位置
  407. * @param count 取得的记录数
  408. * @return LIMIT 子句
  409. */
  410. override fun limit(offset: Int?, count: Int?): String {
  411. if (count == null){
  412. return " OFFSET ${offset ?: 0} LIMIT ${count ?: 1}"
  413. }else if (offset!=null&&count!=null){
  414. return " OFFSET ${offset ?: 0} LIMIT ${count ?: 1}"
  415. }else{
  416. return " OFFSET ${offset ?: 0} LIMIT ${count ?: 1}"
  417. }
  418. // return " OFFSET ${offset ?: 0} LIMIT ${count ?: 1}"
  419. }
  420. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  421. // 函数
  422. /**
  423. * 处理函数支持
  424. *
  425. * @param func 函数对象
  426. * @param colName 字段名
  427. * @return 生成的 SQL 语句
  428. */
  429. override fun processFunction(func: SAbstractFunction, colName: String): String {
  430. func.colName = colName
  431. return func.toSql(SDatabaseType.PostgreSQL)
  432. }
  433. //----------------------------------------------------------------------------------------------------------------------
  434. /**
  435. * 转换where字句参数
  436. *
  437. * @param argName 参数名
  438. * @param argValue 参数值
  439. * @param ops 运算符
  440. * @return 转换后的 SQL
  441. */
  442. override fun whereArg(argName: String, argValue: String, ops: SOps): String {
  443. when (ops) {
  444. SOps.EQ -> { /** 等于 */
  445. return "$argName = $argValue"
  446. }
  447. SOps.NE -> { /** 不等于 */
  448. return "$argName <> $argValue"
  449. }
  450. SOps.GT -> { /** 大于 */
  451. return "$argName > $argValue"
  452. }
  453. SOps.GTE -> { /** 大于等于 */
  454. return "$argName >= $argValue"
  455. }
  456. SOps.LT -> { /** 小于 */
  457. return "$argName < $argValue"
  458. }
  459. SOps.LTE -> { /** 小于等行 */
  460. return "$argName <= $argValue"
  461. }
  462. SOps.CONTAIN -> { /** 包含 */
  463. return if (argName.indexOf("#") > 0) {
  464. "($argName)::TEXT LIKE ('%' || $argValue || '%')"
  465. } else {
  466. // todo: 拓扑图和平面图临时支持ArrayList 模糊查询字符串
  467. /// 临时代码开始
  468. logger.debug("argName=${argName}=11111111111111111111111111111111")
  469. if (argName.indexOf("label") > 0){
  470. "$argName::TEXT LIKE ('%' || $argValue || '%')"
  471. }else {
  472. logger.debug("11111111111111111111111111111111111")
  473. "$argName LIKE ('%' || $argValue || '%')"
  474. }
  475. // 临时代码结束
  476. //////////////////////
  477. // 原始代码开始
  478. // "$argName LIKE ('%' || $argValue || '%')"
  479. // 原始代码结束
  480. }
  481. }
  482. SOps.STARTWITH -> { /** 以指定字符串开始 */
  483. return if (argName.indexOf("#") > 0) {
  484. "($argName)::TEXT LIKE ($argValue || '%')"
  485. } else {
  486. "$argName LIKE ($argValue || '%')"
  487. }
  488. }
  489. SOps.ENDWITH -> { /** 以指定字符串结束 */
  490. return if (argName.indexOf("#") > 0) {
  491. "($argName)::TEXT LIKE ('%' || $argValue)"
  492. } else {
  493. "$argName LIKE ('%' || $argValue)"
  494. }
  495. }
  496. SOps.ISNULL -> { /** 为空 */
  497. return "$argName ISNULL"
  498. }
  499. else -> {
  500. }
  501. }
  502. return ""
  503. }
  504. /**
  505. * 转换参数名 SQL 语句
  506. *
  507. * @param name 字段名
  508. * @param path json 路径。如果不是 json 对象,则该值为空
  509. * @return 转换后的 SQL
  510. */
  511. override fun argName(name: String, path: String?): String {
  512. return if (path == null) {
  513. "\"$name\""
  514. } else {
  515. val p = path.`replace`(".", ",")
  516. "\"$name\"#>'{$p}'"
  517. }
  518. }
  519. /**
  520. * 更新字段为空
  521. */
  522. override fun updateNullItem(nullItem: String): String {
  523. val pos = nullItem.indexOf(".")
  524. val path = nullItem.substring(pos + 1).replace(".",",")
  525. val propertyName = nullItem.substring(0, pos)
  526. return "${SSqlProvider.driver.escName(propertyName)} = (jsonb_set(${SSqlProvider.driver.escName(propertyName)}::jsonb,'{$path}','null'::jsonb))"
  527. }
  528. /**
  529. * 转换参数值 SQL 语句
  530. *
  531. * @param argName 参数名
  532. * @param isJson 是否 Json 对象
  533. * @return 转换后的 SQL
  534. */
  535. override fun argValue(argName: String, isJson: Boolean): String {
  536. return if (isJson) {
  537. "to_jsonb(#{whereArgs.$argName})"
  538. } else {
  539. "#{whereArgs.$argName}"
  540. }
  541. }
  542. /**
  543. * 转换 IN 条件表达式
  544. *
  545. * @param name 字段名
  546. * @param path json 路径,如果字段不为 json,则 path 为 null
  547. * @param inArg in 操作参数
  548. * @return 转换后的 SQL
  549. */
  550. override fun inArg(name: String, path: String?, inArg: String): String {
  551. return if (path == null) {
  552. "\"$name\" IN ($inArg)"
  553. } else {
  554. val p = path.replace(".", ",")
  555. "\"$name\"#>'{$p}' IN ($inArg)"
  556. }
  557. }
  558. /**
  559. * 将名称及 json 路径转换为 SQL
  560. *
  561. * @param name 字段名
  562. * @param path json 路径,如果字段不为 json,则 path 为 null
  563. * @return 转换后的 SQL
  564. */
  565. override fun columnName(name: String, path: String?): String {
  566. return if (path == null) {
  567. "\"$name\""
  568. } else {
  569. val p = path.replace(".", ",")
  570. "\"$name\"#>'{$p}'"
  571. }
  572. }
  573. /**
  574. * 将参数值转换为 SQL 语句
  575. *
  576. * @param value 值
  577. * @param isJson 值是否转换为 json 格式
  578. * @return 转换后的 SQL
  579. */
  580. override fun argValueToJson(value: String, isJson: Boolean): String {
  581. return if (isJson) {
  582. "to_jsonb($value)"
  583. } else {
  584. value
  585. }
  586. }
  587. /**
  588. * 更新 Json 类型字段
  589. *
  590. * @param name 字段名
  591. * @param value 值
  592. * @return 更新 SQL 字符串
  593. */
  594. override fun updateJson(name: String, value: Any): String {
  595. return "COALESCE(\"$name\", '{}') || '${value.toJsonAll().replace("'", "''")}'"
  596. }
  597. /**
  598. * 在数据库中替换实体-生成replace语句部分插入sql语句
  599. *
  600. * @param argsMap 注入参数
  601. *
  602. * @return 替换 SQL 语句
  603. */
  604. @Suppress("UNCHECKED_CAST")
  605. private fun replaceInsert(argsMap: Map<String, Any?>): String {
  606. val builder = argsMap["builder"] as SReplaceBuilder<*>?
  607. val entityClass = argsMap["entityClass"] as Class<*>
  608. val entity = argsMap["entity"] as HashMap<String, Any?>
  609. val sql = object : SQL() {
  610. init {
  611. /** 如果查询构建器朱指定了表名 */
  612. if (builder!=null&&!builder.tableName.isNullOrEmpty()) {
  613. INSERT_INTO(builder.tableName!!)
  614. } else {
  615. INSERT_INTO(SSqlProvider.driver.tableName(entityClass))
  616. }
  617. for ((key, value) in entity) {
  618. if (value != null) {
  619. if (value is Map<*, *>) {
  620. VALUES(SSqlProvider.driver.escName(key), "'${value.toJsonAll().replace("'", "''")}'")
  621. } else if (value is List<*>) {
  622. VALUES(SSqlProvider.driver.escName(key), "'${value.toJsonAll().replace("'", "''")}'")
  623. } else if (value::class.java.isPrimitive) {
  624. VALUES(SSqlProvider.driver.escName(key), "'${value.toJsonAll().replace("'", "''")}'")
  625. } else {
  626. VALUES(SSqlProvider.driver.escName(key), SSqlProvider.driver.entityValue(entity, key))
  627. }
  628. // if (value::class.java.isPrimitive) {
  629. // VALUES(driver.escName(key), driver.entityValue(entity, key))
  630. // } else {
  631. // VALUES(driver.escName(key), "'${value.toJsonAll()}'")
  632. // }
  633. }
  634. }
  635. }
  636. }.toString()
  637. logger.debug("INSERT SQL= $sql")
  638. return sql
  639. }
  640. }