我做了一个java项目,并且第一次使用H2来测试我的程序。 我正在使用H2来运行我的Junit&黄瓜试验。
我有一个查询从几个表中获取数据。
SELECT film.TITLE, film.DIRECTOR, cinema.LOCATION, cinema.THEATER_NAME, SUM(income.NUMBER_VIEW)
FROM DRFGIRF7B_OPE.MOVIE as film
INNER JOIN DRFGIRF7B_OPE.MOVIE_THEATER as income ON film.FILM_ID = income.FILM_ID
INNER JOIN DRFGIRF7B_OPE.THEATER as cinema ON income.THEATER_ID = cinema.THEATER_ID
WHERE film.COUNTRY_COD = 'FRA'
GROUP BY film.TITLE, film.DIRECTOR, cinema.LOCATION;
在这里," cinema.THEATER_NAME"缺少GROUP BY语句。 当我在SQL IDE中执行此查询时,我有此错误消息(这是预期的):
SQL Failed : Selected non-aggregate values must be part of the assiociated group
但是当我用Junit运行我的测试时,H2没有检测到这个问题,并且我的所有测试都通过了,而查询被调用。
你有一个想法,为什么我的测试没有失败?
答案 0 :(得分:1)
不同的数据库供应商采取不同的做法。例如,MySQL and SQLite决定违反规范和大多数其他数据库,并在select
使用group by
时允许使用任何列(将使用其中一个值)。
H2并没有记录它违反标准并基于error message:
当在表达式列表或组或聚合查询的order by子句中使用列时,抛出代码90016的错误,并且该列不在GROUP BY子句中。
您的查询不应被允许,您的测试应该失败。
然而实际发生的情况是,当查询只返回一个不在group by
H2中的列的值时,它允许它:
create table test(a int, b int);
insert into test values(1,1);
insert into test values(1,1);
select a,b from test group by a; -- output 1,1
当有多个值时,它会失败。
insert into test values(1,1);
insert into test values(1,2);
select a,b from test group by a; -- Error: Column "B" must be in the GROUP BY list
这看起来像一个错误,应该报告(如果没有其他人愿意,我可能会在不久的将来自己做。)
您遇到的问题是一个完美的例子,说明为什么使用不同的数据库进行测试和制作是一个糟糕的想法。
答案 1 :(得分:0)
您使用的数据库可能对这些查询的限制性更强。
如果您想在测试中更接近现实,请尝试像下面这样配置H2连接:
http://www.h2database.com/html/tutorial.html#using_hibernate