org.h2.jdbc.JdbcSQLException:找不到列“Salman”;

Posted

技术标签:

【中文标题】org.h2.jdbc.JdbcSQLException:找不到列“Salman”;【英文标题】:org.h2.jdbc.JdbcSQLException: Column "Salman" not found; 【发布时间】:2016-02-26 08:00:49 【问题描述】:

我尝试在我的 spring 应用程序中运行以下测试。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=App1Application.class)
@Sql(scripts="customerTest.sql")
@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)

public class customerTest 


    @Autowired 
    customerRepository  customerDB;

    @Test
    public void countRecords()

        assertThat(customerDB.count(),is(2l));

       

customerTest.sql 文件中我有:

insert into customer(id,name,lastname) values(1,"name","lastname");

这是我的客户

@Entity
@Data

public class customer 

    @Id
    @GeneratedValue
    int id;

    String name;
    String lastname;
    

我也使用 jpa

public interface customerRepository  extends JpaRepository<customer,Long>


问题是,当我运行测试时,我遇到了错误:

 org.h2.jdbc.JdbcSQLException: Column "Salman" not found; SQL statement:
insert into customer(id,name,lastname) values(1,"name","lastname")

同时“Salman”是一个值而不是一个列?

请注意,我使用的是spring-mvc所以没有没有数据库 我只有代码制作的模型 (customer)。

【问题讨论】:

那么文件“customerTest.sql”包含什么? 它包含 2 个插入查询,正如我所提到的 双引号 " 是 SQL 中的保留字符。因此,"Salman" 不是您期望的字符串值,而是对象标识符,在INSERT 语句的上下文中,它被推断为列名。 SQL 中的字符串需要用单引号 ' 包裹。 "Salman" 应该是 'Salman'"Lashkarara" 应该是 'Lashkarara' h2database.com/html/grammar.html#string 【参考方案1】:

编译器出现这种错误的行为对我来说仍然是一个问题, 但我设法使用这个单引号 '' 而不是双引号 "" 来处理这个错误

我用这个

insert into customer(id,name,lastname) values(1,'name','Lastname')

而不是

 insert into customer(id,name,lastname) values(1,"name","Lastname")

【讨论】:

花了几个小时才终于找到这个答案。像魅力一样工作。但我从没想过“会造成问题。这是怎么回事?【参考方案2】:

尝试使用 ''(单引号)而不是 ""(双引号)。我认为这是H2库中的一个问题

【讨论】:

【参考方案3】:

我知道这个答案有点晚了,但它仍然需要改进。 不要在数据库中传递或插入这样的值,总是有 SQL 注入的机会。您可以做的是使用PreparedStatement,然后使用setString()setInteger() 或您想要传递的任何值将值传递给您的查询。因此,您的查询将具有更好的性能,并且安全威胁最小。例如,

String insert = "INSERT into table_name(id, name,lastname) values (?, ?, ?)"
PreparedStatement insertStatement = conn.prepareStatement(insert);
insertStatement.setInteger(1, id);
insertStatement.setString(2, name);
insertStatement.setString(3, lastname);
insertStatement.executeUpdate();
insertStatement.close();

其中conn 是与您的数据库建立的连接。并且不要忘记关闭PreparedStatement 和连接。

【讨论】:

【参考方案4】:

尝试在项目中使用 FULL PATH 到您的数据库。排除相对路径后,此问题得到解决。在最后的 H2 数据库版本中使用“~/RELATIVE_PATH”有一些错误! 不好的例子: “jdbc:h2:~\com\project\db\h2\h2testdb” 好例子: "jdbc:h2:C:\Users\UserName\IdeaProjects\projectname\com.project\src\main\java\com\test\db\h2\h2testdb"

【讨论】:

【参考方案5】:

您必须在实体模块中设置数据库表字段的名称(在您的情况下为customer.java 类),如下所示:

@Column(name = "field_name_in_the_table")
String name;

然后在你的SQL脚本文件customerTest.sql中写下数据库文件名如下:

INSERT INTO customer (id, field_name_in_the_table, lastname) values(1,"name","lastname");

【讨论】:

以上是关于org.h2.jdbc.JdbcSQLException:找不到列“Salman”;的主要内容,如果未能解决你的问题,请参考以下文章