我正在写一个商品搜索管理器(ProductSearchManager),我采用Hibernate及HSQLDB的方式来单元测试持久层代码。但结果单元测试老是通不过,结果我发现是HSQLDB原因。
理由如下:/**
 * Criteria接口学习案例
 * @author DongAn Computer Technology
 *
 */
public class CriteriaLearningCase{
public List learningCriteriaForSimpleEquationQuery(){
List prods = null;
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Product.class);
criteria.add(Restrictions.eq("name","品牌电脑"));//品牌电脑
//criteria.add(Restrictions.sqlRestriction("{alias}.NAMA=?","品牌电脑",Hibernate.STRING));
//criteria.add(Property.forName("name").eq("品牌电脑"));
prods = criteria.list();
tx.commit();
session.close();
return prods;
}
}
上面的代码不能查询到任何内容,而且我使用p6spy查询上面代码最终执行的SQL语句也完全正确,即:
select product0_.ID as ID1_, product0_.NAMA as NAMA1_, product0_.CODE as CODE1_, product0_.BARCODE as BARCODE1_, product0_.MEMO as MEMO1_, product0_.BRIEF_DESC as BRIEF6_1_, product0_.MANF as MANF1_, product0_.HRCHY_LEVEL as HRCHY8_1_, product0_.CAT_ID as CAT9_1_ from PROD product0_ where product0_.NAMA='品牌电脑'
接着,我把底层数据库改为MySQL,查询一切正常,完全符合预期。SQL语句也同上!!!同时,若Restrictions.eq方法中没有中文字符在MySQL及HSQLDB环境下都完全符合预期。接着,我分别为MySQL及HSQLDB来调试了跟踪上面代码,发现一切执行正常,包括SQL语句。于是,我Google及百度,发现同样有一些人和我有同样的问题。我当然可以直接用MySQL数据库来调试!!!但我已经写了许多使用HSQLDB数据库的单元测试!!而且HSQLDB数据库也非常棒,它作为单元测试所使用的数据库!网上说可以使用别名来解决这个问题
criteria.add(Restrictions.sqlRestriction("{alias}.NAMA=?","品牌电脑",Hibernate.STRING));
但我试了上面代码,还是不行。问题及现象依旧。我想问问大家,有没有同样问题,如何解决呀?我的Hibernate及HSQLDB的版本使用的是:Hibernate版本是3.2.7.ga
HSQLDB版本是1.8.0.10其它依赖库我使用是MAVEN管理的,自动从APACHE的MAVEN中心下载导入的库。大家所使用的HSQLDB版本是多少,有同样的问题么?