通过 spring 进行集成测试,hsqldb 无法识别 "use index"
integration tests via spring, hsqldb doesn't recognize "use index"
我有一个 spring 项目,其中包含 dao 和集成测试。对于集成测试,我使用的是 hsqldb。
一切正常,直到我不得不将 "USE INDEX" 命令添加到我的查询中。该应用程序工作正常并按预期获取记录。
但是测试开始失败,出现 SQL 异常 "Unexpeced token USE in command"。
所以我想知道,有没有办法配置htsqldb来识别"USE INDEX"语句?谢谢
我的 Dao 如下所示:
public interface SomeDao extends CrudRepository<Mapping, Integer> {
@Query(value = "SELECT mm.record_id" +
" FROM mappings mm" +
" USE INDEX (mapping_indx)" +
" JOIN records ss ON mm.record_id = ss.id "
" WHERE mm.name= :name", nativeQuery = true)
public List<Integer> getRecordsIds(@Param("name") String name);
}
我的测试例子:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:testContext.xml")
public class SimpleTEst{
@Autowired
private SomeDao someDao;
//...other daos
@Test
public void testDao() {
//...test background creation
List<Integer> actualList = someDao.getRecordsIds("testing");
assertEquals(expectedList, actualList);
}
}
testContext.xml 包含以下设置
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:myTest"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaDialect" ref="jpaDialect"/>
<property name="persistenceXmlLocation" value="classpath*:/META-INF/persistence.xml"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="dataSource" ref="dataSource"/>
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="namingStrategy" class="org.hibernate.cfg.ImprovedNamingStrategy"/>
不同的数据库不兼容,所以一般来说,您不能 运行 相同 sql 两者。您有一些快速的潜在解决方法:
- 教你新的测试数据库constructs/functions。在某些内存数据库中,您可以注册新功能。不确定是不是你的情况
- 在不同供应商数据库上 运行 时跳过一些测试。如果您不在 same-vendor-db 上也进行测试,那么这实际上意味着:删除测试 :(
- create/choose 根据您 运行 时间检测到的供应商动态查询。这样你就可以限制查询的测试部分
总结一下:可能绝对没有办法在 hsqldb 上测试 use index
。你应该在真正的数据库上测试它。如果你真的想坚持使用 hsqldb,你可以做的是尝试尽可能地测试相似的查询...但不一样,抱歉
我有一个 spring 项目,其中包含 dao 和集成测试。对于集成测试,我使用的是 hsqldb。 一切正常,直到我不得不将 "USE INDEX" 命令添加到我的查询中。该应用程序工作正常并按预期获取记录。 但是测试开始失败,出现 SQL 异常 "Unexpeced token USE in command"。
所以我想知道,有没有办法配置htsqldb来识别"USE INDEX"语句?谢谢
我的 Dao 如下所示:
public interface SomeDao extends CrudRepository<Mapping, Integer> {
@Query(value = "SELECT mm.record_id" +
" FROM mappings mm" +
" USE INDEX (mapping_indx)" +
" JOIN records ss ON mm.record_id = ss.id "
" WHERE mm.name= :name", nativeQuery = true)
public List<Integer> getRecordsIds(@Param("name") String name);
}
我的测试例子:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:testContext.xml")
public class SimpleTEst{
@Autowired
private SomeDao someDao;
//...other daos
@Test
public void testDao() {
//...test background creation
List<Integer> actualList = someDao.getRecordsIds("testing");
assertEquals(expectedList, actualList);
}
}
testContext.xml 包含以下设置
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:myTest"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaDialect" ref="jpaDialect"/>
<property name="persistenceXmlLocation" value="classpath*:/META-INF/persistence.xml"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="dataSource" ref="dataSource"/>
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="namingStrategy" class="org.hibernate.cfg.ImprovedNamingStrategy"/>
不同的数据库不兼容,所以一般来说,您不能 运行 相同 sql 两者。您有一些快速的潜在解决方法:
- 教你新的测试数据库constructs/functions。在某些内存数据库中,您可以注册新功能。不确定是不是你的情况
- 在不同供应商数据库上 运行 时跳过一些测试。如果您不在 same-vendor-db 上也进行测试,那么这实际上意味着:删除测试 :(
- create/choose 根据您 运行 时间检测到的供应商动态查询。这样你就可以限制查询的测试部分
总结一下:可能绝对没有办法在 hsqldb 上测试 use index
。你应该在真正的数据库上测试它。如果你真的想坚持使用 hsqldb,你可以做的是尝试尽可能地测试相似的查询...但不一样,抱歉