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

时间:2016-02-26 08:00:49

标签: java spring-mvc

我试图在我的春季应用程序中运行以下测试。

@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)由代码制作。

5 个答案:

答案 0 :(得分:15)

谴责者犯这样的错误的行为对我来说仍然是一个问题, 但我设法使用此listOfDifferences而不是双引号single quote ''

来处理此错误

我用这个

""

而不是

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

答案 1 :(得分:1)

尝试使用&#39;&#39; (单引号)代替&#34;&#34; (双引号)。我认为这是H2库中的一个问题

答案 2 :(得分:0)

我知道这个答案有点迟,但仍需要改进。 不要在数据库中传递或插入这样的值,总是有可能注入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和连接。

答案 3 :(得分:0)

尝试对项目中的数据库使用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”

答案 4 :(得分:0)

您必须在实体模块(在您的情况下为 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");