我有一个带有dao和集成测试的spring项目。对于集成测试,我使用的是hsqldb。 一切都很好,直到我不得不添加" USE INDEX"命令我的查询。应用程序正常工作并按预期获取记录。 但测试开始因SQL异常而失效"命令中未使用的令牌USE"。
所以我想知道,有没有办法配置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"/>
答案 0 :(得分:1)
不同的dbs不兼容,所以一般情况下,你不能在它们上运行相同的sql。你有一些快速的潜在解决方法:
总结一下:绝对没有办法在hsqldb上测试use index
。你应该在真正的数据库上测试它。如果你真的想坚持使用hsqldb,你可以做的就是尝试尽可能地测试类似的查询......但不一样,抱歉