在Postgres中查询失败但在H2中工作(Postgres模式)

时间:2015-02-17 02:05:26

标签: spring hibernate postgresql h2

我经常发现自己处于需要为数据库查询编写自动化测试的情况。我目前的用例是Spring MVC Web应用程序和Postgres数据库。据我所知,我有两个选择:

站起一个实际的Postgres实例并使用测试数据集对其进行初始化 利用H2等内存数据库。 我过去使用过选项#1(尽管有Oracle数据库和Oracle XE)并取得了很好的成功。这种方法的主要缺点是测试不是自包含的。为了成功运行集成测试,您需要实际设置数据库环境,并使其可以从运行测试的任何位置进行访问。 H2解决方案在这方面更具吸引力,因为配置都包含在项目中。

不幸的是,我遇到过H2数据库(在Postgres模式下)的行为与实际的Postgres实例不同的情况。

@Query("SELECT p FROM Project p WHERE "
        + "(:state is NULL or p.state = :state) and "
        + "(:projectType is NULL or p.projectType = :projectType))")

此查询的目的是将两个参数(state和projectType)视为可选。如果客户端提供具有特定值的参数,则返回具有该值的记录。如果没有,则返回所有记录。

此查询适用于H2,但在实际的Postgres实例中失败:

org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = bytea Hint: 
No operator matches the given name and argument type(s). You might need to add explicit type casts.

现在我担心我无法相信我的集成测试。这项工作的全部目的是测试我的SQL是否正确。但是现在我不能相信我的SQL是正确的,即使我的所有测试都通过了。

我的问题是,是否有人知道为什么Postgres 9中出现此错误而Postgres模式中没有H2?

0 个答案:

没有答案