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, '[email protected]'),
(2, '20', 20, '[email protected]'),
(3, '30', 28, '[email protected]'),
(4, '40', 21, '[email protected]'),
(5, '50', 24, '[email protected]');

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關鍵字可做類似處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章