Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 钥匙持有人返回“;生成的“U键”;在MySQL上执行select查询时_Java_Mysql_Spring Boot_Mysql Connector - Fatal编程技术网

Java 钥匙持有人返回“;生成的“U键”;在MySQL上执行select查询时

Java 钥匙持有人返回“;生成的“U键”;在MySQL上执行select查询时,java,mysql,spring-boot,mysql-connector,Java,Mysql,Spring Boot,Mysql Connector,我正在用MySQL和Postgres开发spring启动应用程序。当我使用MySQL属性运行时,测试失败,出现以下错误。但它在博士后和H2上运行良好。我使用的是MySQL的最新版本 implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.25' 我的创建表定义 jdbcTemplate.execute("DROP TABLE IF EXISTS user"); jdbcTempl

我正在用MySQL和Postgres开发spring启动应用程序。当我使用MySQL属性运行时,测试失败,出现以下错误。但它在博士后和H2上运行良好。我使用的是MySQL的最新版本

implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.25'
我的创建表定义

jdbcTemplate.execute("DROP TABLE IF EXISTS user");

jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS user (\n" +
         "  id INT AUTO_INCREMENT PRIMARY KEY,\n" +
         "  name VARCHAR(250) NOT NULL\n" +
          ")");
我使用以下代码插入了一行

            KeyHolder keyHolder = new GeneratedKeyHolder();
            String query = "insert into user (name) values ('Foo')";

            // create the mysql insert preparedstatement
            jdbcTemplate.update(connection -> {
                PreparedStatement ps = connection.prepareStatement(query, new String[]{"PrimaryKeyColumnName"});
                return ps;

            }, keyHolder);

            for (Map.Entry<String, Object> entry : keyHolder.getKeys().entrySet()) {
                System.out.println("ENTRY: " + entry);
                List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM user WHERE " + entry.getKey() + "= ?", entry.getValue());
                System.out.println("result: " + result);
            }
错误:

ENTRY: GENERATED_KEY=1
PreparedStatementCallback; bad SQL grammar [SELECT * FROM user WHERE GENERATED_KEY= ?]; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'GENERATED_KEY' in 'where clause'
H2特性

# MySQL Config
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57InnoDBDialect
# H2
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
当我使用H2时,它返回主键列名

ENTRY: ID=1
MySQL中缺少什么,如何获取主键列名而不是MySQL上生成的_键


这里的任何输入都非常感谢

下面这行似乎有问题

List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM user WHERE " + entry.getKey() + "= ?", entry.getValue());

是的,但是我们应该如何填充MySQL上的keyholder呢。上面的代码在Postgres和H2上运行良好。您好@SST,也许,我不知道您到底想做什么。将行插入表中时,自动生成的键对您可用。我的意思是,在执行插入操作时,keyholder返回MySql数据库生成的主键。因此,id值在表中已经可用。自动生成的键返回值很好,但主键列是生成的\u key,而不是IDAH ok,我现在知道了。似乎MySql从来没有为它返回正确的列名:(是否有相关文档?
List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM user WHERE id = ?", entry.getValue());