KingbaseES V8适配mybatisPlus问题处理--——level关键字做字段名

KingbaseES V8适配mybatisPlus问题处理——kingbase库关键字做表字段名

问题概述

kingbase中关键字做表名、字段名时,在查询语句中会优先解析为关键字,想要解析为字段名需要加双引号;而在mybatisPlus插件中,类似Hibernate,sql语句由框架自动生成,默认生成的sql是不会对字段名加双引号的;因此会导致查询可能报错。

示例程序

示例表:

CREATE TABLE USER1
(
	id BIGINT NOT NULL ,
	level VARCHAR(30) NULL DEFAULT NULL ,
	age INT NULL DEFAULT NULL ,
	email VARCHAR(50) NULL DEFAULT NULL ,
	PRIMARY KEY (id)
);

INSERT INTO "USER1" (id, "LEVEL", age, email) VALUES
(1, '10', 18, 'test1@baomidou.com'),
(2, '20', 20, 'test2@baomidou.com'),
(3, '30', 28, 'test3@baomidou.com'),
(4, '40', 21, 'test4@baomidou.com'),
(5, '50', 24, 'test5@baomidou.com');

Note: level为kingbase关键字,在层次查询中,level伪列代表当前元组所在的层;level做字段名时,sql语句中需要加双引号,才可被解析为字段名;

mybatisPlus示例程序

实体类:

package com.example.demo1.entity;

import lombok.Data;

@Data
public class User1 {
    private Long id;
    private String level;
    private Integer age;
    private String email;
}

接口映射:

package com.example.demo1.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo1.entity.User1;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;

import java.util.List;

@Component(value ="user1Mapper")
public interface User1Mapper extends BaseMapper<User1> {
}

application.yml:

spring:
  datasource:
    driver-class-name: com.kingbase8.Driver
    schema: classpath:db/schema-h2.sql
    data: classpath:db/data-h2.sql
    url: jdbc:kingbase8://***.***.***.***:54321/TEST1
    username: SYSTEM
    password: ******

测试程序:


@RunWith(SpringRunner.class)
@SpringBootTest
@MapperScan("com.example.demo1.mapper")
class Demo1ApplicationTests {

	@Autowired(required = false)
	private User1Mapper user1Mapper;

	@Test
	public void testSelect() {
		System.out.println(("----- selectAll method test ------"));
		List<User1> user1List = user1Mapper.selectList(null);
		Assert.assertEquals(5, user1List.size());
		user1List.forEach(System.out::println);
	}

}

以上程序如果没有level字段,运行是正常的;但是出现level关键字做字段名的情况下,会报错:

org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: com.kingbase8.util.KSQLException: ERROR: CONNECT BY clause required in this query block
  Position: 12
### The error may exist in com/example/demo1/mapper/User1Mapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT  id,level,age,email  FROM user1
### Cause: com.kingbase8.util.KSQLException: ERROR: CONNECT BY clause required in this query block
  Position: 12
; bad SQL grammar []; nested exception is com.kingbase8.util.KSQLException: ERROR: CONNECT BY clause required in this query block
  Position: 12

以上报错信息可以看到框架生成的sql为:
SQL: SELECT id,level,age,email FROM user1
此处,level未加双引号,会被解析为level伪列,引起程序结果异常。

问题处理

kingbase中查询语句出现关键字做字段名,需要将字段名大写并外加双引号;mybatisPlus可以自动生成sql,也支持传统的mybatis方式指定映射的sql语句。映射接口可做如下修改,例:

@Component(value ="user1Mapper")
public interface User1Mapper extends BaseMapper<User1> {
    @Select("SELECT id,\"LEVEL\",age,email FROM user1")
    List<User1> selectList();
}

以上改动主要是人工指定select List映射的sql,把level关键字大写并外加双引号。
修改完成后,再次测试程序,运行正常。sql中出现其它kingbase关键字可做类似处理。

【更多人大金仓数据库信息,详见https://help.kingbase.com.cn/】

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KingbaseES V8是一种基于开源PostgreSQL数据库的企业级数据库管理系统。它被开发为一个高度可扩展和安全的解决方案,适用于各种规模的企业数据处理需求。 KingbaseES V8数据库技术白皮书详细介绍了该数据库系统的特点和优势。下面是一些关键内容: 1. 安全性:KingbaseES V8采用了严格的安全机制来保护数据的机密性和完整性。它支持数据加密、访问控制和安全审计等功能,确保敏感数据不会被未经授权的人员访问。 2. 高可靠性:KingbaseES V8通过提供数据库事务和持久性来确保数据的可靠性。它支持ACID(原子性、一致性、隔离性和持久性)属性,使得数据库在发生故障或中断时能够进行恢复并保持数据的一致性。 3. 高扩展性:KingbaseES V8支持水平和垂直扩展,可以根据业务需求进行灵活的扩展。它能够处理大规模的数据存储和查询,并提供了分布式数据库和集群部署选项。 4. 大数据处理KingbaseES V8具备处理大数据的能力,通过支持多种数据压缩和索引技术来提高数据存储和查询的效率。同时,它还提供了强大的数据备份和恢复机制,确保在数据发生意外故障时能够及时进行数据恢复。 5. 兼容性:KingbaseES V8与主流数据库标准兼容,可以实现与Oracle、SQL Server等数据库的互通和迁移。这样一来,企业在将原有数据库迁移到KingbaseES V8上时,可以事半功倍地减少迁移成本和风险。 总的来说,KingbaseES V8数据库技术白皮书详细介绍了其作为一种可靠、高效和安全的企业级数据库管理系统的优势和功能。这些特点使得KingbaseES V8成为适用于各种企业规模和数据处理需求的理想选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值